[ 
https://issues.apache.org/jira/browse/GROOVY-12512?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul King reassigned GROOVY-12512:
----------------------------------

    Assignee: Paul King

> SC: instance method of the enclosing class called from an anonymous class in 
> a static context compiles, then fails with VerifyError
> -----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-12512
>                 URL: https://issues.apache.org/jira/browse/GROOVY-12512
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation, Static Type Checker
>    Affects Versions: 6.0.0
>            Reporter: Scott Murphy Heiberg
>            Assignee: Paul King
>            Priority: Major
>
> An anonymous class created in a static method has no enclosing instance, so 
> it cannot call an instance method of the enclosing class. {{@CompileStatic}} 
> accepts the call and generates code that fails verification:
> {code:groovy}
> @groovy.transform.CompileStatic
> class Box {
>     String pm() { 'pm' }
>     static Object test() {
>         def result
>         new Runnable() {
>             void run() { result = pm() }
>         }.run()
>         result
>     }
> }
> Box.test()
> {code}
> Result:
> * {{@CompileStatic}}: {{java.lang.VerifyError: Bad type on operand stack}} 
> (in {{Box$1.run}})
> * dynamic Groovy and {{@TypeChecked}}: 
> {{groovy.lang.MissingMethodException}}: "No signature of method: pm for 
> class: Box$1 is applicable for argument types: ()"
> * javac: "non-static method pm() cannot be referenced from a static context"
> The same happens for a private method, for an anonymous class in a static 
> initializer or a static field initializer, and for an anonymous class in a 
> static method of a static nested class (all {{VerifyError}}). With a closure 
> inside the anonymous class, or an anonymous class created inside a closure in 
> a static method, {{@CompileStatic}} fails at run time with a 
> {{ClassCastException}} ({{Box$1 cannot be cast to Box}}, or {{java.lang.Class 
> cannot be cast to Box}}).
> A reference to an instance field in the same place is already rejected 
> ("Apparent variable 'id' was found in a static scope but doesn't refer to a 
> local variable, static field or class"), and the same call in a lambda gets 
> "Non-static method Box#pm cannot be called from static context".
> Seen in 4.0.33, 5.0.8, 6.0.0 and master.
> Expected: a compile error under {{@TypeChecked}} and {{@CompileStatic}}, such 
> as "Non-static method Box#pm cannot be called from static context".



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to