Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-8176

tap - exception in phase 'instruction selection'

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.5.0-alpha-1
    • Fix Version/s: 2.5.0-beta-1
    • Component/s: Compiler
    • Labels:
      None

      Description

      import groovy.transform.CompileStatic
      
      @CompileStatic
      abstract class Person {
      	String firstName
      	String lastName
      }
      
      @CompileStatic
      class Student extends Person {
      	Set<String> courses
      }
      
      @CompileStatic
      final class Converter {
      	static <P extends Person> P toUser1(P person, Map map) { // ok
      		if (!map) {
      			return person
      		}
      
      		person.firstName = map['firstName']
      		person.lastName = map['lastName']
      		return person
      	}
      
      	static <P extends Person> P toUser2(P person, Map map) { // ok
      		if (!map) {
      			return person
      		}
      
      		person.tap {
      			firstName = map['firstName']
      			lastName = map['lastName']
      		}
      	}
      
      	static <P extends Person> P toUser3(P person, Map map) { // ok
      		person.tap {
      			firstName = map['firstName']
      			lastName = map['lastName']
      		}
      	}
      
      	// Caught: BUG! exception in phase 'instruction selection' in source unit '/reproducer.groovy' unexpected NullpointerException
      	static <P extends Person> P toUser4(P person, Map map) {
      		!map ? person : person.tap {
      			firstName = map['firstName']
      			lastName = map['lastName']
      		}
      	}
      
      	// static Student toStudent(Map map) {
      	// 	!map ? null : toUser4(new Student(), map)
      	// }
      }
      
      @CompileStatic
      class Reproducer {
      	static void reproduce() {
      		Map map = [firstName: 'John', lastName: 'Doe']
      
      		println Converter.toUser1(new Student(), map).dump()
      		println Converter.toUser2(new Student(), map).dump()
      		println Converter.toUser3(new Student(), map).dump()
      		//println Converter.toUser4(new Student(), map).dump()
      		//println Converter.toStudent(map).dump()
      	}	
      }
      
      Reproducer.reproduce()
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                paulk Paul King
                Reporter:
                cazacugmihai Cazacu Mihai
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: