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

tap - exception in phase 'instruction selection'

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.5.0-alpha-1
    • 2.5.0-beta-1
    • Compiler
    • 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

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

              Dates

                Created:
                Updated:
                Resolved: