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

Scott Murphy Heiberg closed GROOVY-12686.
-----------------------------------------
    Resolution: Duplicate

Duplicate of GROOVY-12626, filed by mistake; 
https://github.com/apache/groovy/pull/3152 fixes it.

> SC: a private field of the outer class used in an enum constant body or in an 
> anonymous subclass created in a static method fails with VerifyError
> --------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-12686
>                 URL: https://issues.apache.org/jira/browse/GROOVY-12686
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation
>    Affects Versions: 4.0.32, 5.0.8, 6.0.0
>            Reporter: Scott Murphy Heiberg
>            Priority: Major
>
> {code:groovy}
> @groovy.transform.CompileStatic
> enum E {
>     A { String d() { [f, this.f, { -> f }()].join(',') } }
>     private String f = 'e'
>     String d() { f }
> }
> println E.A.d()
> @groovy.transform.CompileStatic
> class Outer {
>     private String f = 'outer'
>     static String m() { new Outer() { String toString() { [f, this.f, { -> f 
> }()].join(',') } }.toString() }
> }
> println Outer.m()
> {code}
> *Actual:* {{VerifyError: Bad type on operand stack}} ... {{Type 'E$1' 
> (current frame, stack[3]) is not assignable to 'groovy/lang/Closure'}}, and 
> the same for {{Outer$1}}. Each form fails on its own, and so does a write 
> such as {{f = 'a'}}.
> *Expected:* {{e,e,e}} and {{outer,outer,outer}}: the field of this instance, 
> as GROOVY-12533 gives for a static nested subclass of the declaring class, 
> which has no enclosing instance either.
> Cause: since GROOVY-12533, 
> {{StaticCompilationTransformer.hasEnclosingInstanceOf}} decides between 
> {{this}} and {{DeclaringClass.this}} for such a field. It treats only a class 
> with the static modifier as having no enclosing instance, so it reads the 
> field through {{E.this}} or {{Outer.this}}. An enum constant body and an 
> anonymous class created in a static method have no enclosing instance either.
> Dynamic Groovy and {{@TypeChecked}} throw {{MissingPropertyException}} for 
> these forms, and that is unchanged.
> Verified on 5.0.8, 6.0.0 and master. On 4.0.32 the closure form fails with 
> the same {{VerifyError}}, and the other forms throw 
> {{MissingPropertyException}}. On master {{this.@f}} in the enum constant body 
> already works.



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

Reply via email to