Octavia Togami created GROOVY-12226:
---------------------------------------

             Summary: Double-nested non-static class in trait calling outer 
method compiles, but fails at runtime
                 Key: GROOVY-12226
                 URL: https://issues.apache.org/jira/browse/GROOVY-12226
             Project: Groovy
          Issue Type: Bug
          Components: Compiler
    Affects Versions: 5.0.8
            Reporter: Octavia Togami


The following code works in 4.0.33, but fails in 5.0.8:
{code:groovy}
trait T {
    static class Outer {
        def outerMethod() { 'p' }
        class Inner { def callOuter() { outerMethod() } }
        def viaInner() { new Inner().callOuter() }
    }
}
assert new T.Outer().viaInner() == 'p'
{code}
The failure is:
{code:sh}
java.lang.NoSuchMethodError: 'java.lang.Object 
T$Outer.this$dist$invoke$1(java.lang.String, java.lang.Object)'
    at T$Outer$Inner.methodMissing(v6_named.groovy)
    at T$Outer$Inner.callOuter(v6_named.groovy:4)
{code}

This is because the compiler tries to generate a call to 
{{T$Outer.this$dist$invoke$1}} in {{callOuter}}, but does not generate that 
method in {{T$Outer}}, unlike Groovy 4. It should either produce a proper 
compiler error, or generate the bridge method.

This was reduced from real code in Gradle: 
https://github.com/gradle/gradle/blob/2e04b0a02ba788075b2be3614f9fc0562ecfaf9d/platforms/native/language-native/src/testFixtures/groovy/org/gradle/language/LanguageTaskNames.groovy#L121



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to