[ https://issues.apache.org/jira/browse/GROOVY-7075?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14963595#comment-14963595 ]
Aaron Zirbes commented on GROOVY-7075: -------------------------------------- This appears to still be an issue. I ran into it when using a Retrofit interface that returned an in with @CompileStatic in Groovy 2.4.5 > Safe Navigation operator does not perform null check with @CompileStatic on > interface type not declaring getter > --------------------------------------------------------------------------------------------------------------- > > Key: GROOVY-7075 > URL: https://issues.apache.org/jira/browse/GROOVY-7075 > Project: Groovy > Issue Type: Bug > Components: Static compilation > Affects Versions: 2.3.6 > Reporter: Jason Winnebeck > Assignee: Cédric Champeau > Priority: Critical > Fix For: 2.3.7 > > > The following code produces NullPointerException when compiled static, but > operates as expected when running in dynamic groovy: > {code} > import groovy.transform.CompileStatic > @Grapes( > @Grab(group='org.springframework.security', module='spring-security-core', > version='3.2.5.RELEASE') > ) > import org.springframework.security.core.context.SecurityContextHolder > @CompileStatic > def checkSafeNavi() { > println SecurityContextHolder > //class org.springframework.security.core.context.SecurityContextHolder > println SecurityContextHolder.context > //org.springframework.security.core.context.SecurityContextImpl@ffffffff: > Null authentication > println SecurityContextHolder.context?.authentication > //null > println SecurityContextHolder.context?.authentication?.name > //NullPointerException > } > checkSafeNavi() > {code} > Thanks to Thibault Kruse for producing a minimal reproducible version. > Here is another test case that doesn't use Spring Security or any other > dependency. This hopefully should be able to be transformed directly into a > unit test for Groovy: > {code} > //If Y was a class implementing YParent, it works > //If Y had the getValue method directly, it works > //If Y redeclares (overrides) getValue, it works > interface Y extends YParent { > } > interface YParent { > int getValue() > } > @groovy.transform.CompileStatic > def check() { > Y y = null > println y?.value > } > check() > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)