Cazacu Mihai created GROOVY-8176:
------------------------------------

             Summary: tap - exception in phase 'instruction selection'
                 Key: GROOVY-8176
                 URL: https://issues.apache.org/jira/browse/GROOVY-8176
             Project: Groovy
          Issue Type: Bug
          Components: Compiler
    Affects Versions: 2.5.0-alpha-1
            Reporter: Cazacu Mihai


{code}
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()
{code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to