Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-7149

@CompileStatic 'Access to <property> is forbidden' with abstract base class and interface

Agile BoardAttach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments


    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.3.7
    • 2.3.8, 2.4.0-beta-4
    • Static compilation
    • None
    • Ubuntu Linux 14.04.1 - 3.13.0-39-generic
      Groovy Version: 2.3.7 JVM: 1.8.0_05 Vendor: Oracle Corporation OS: Linux


      The CompileStatic annotation incorrectly reports the following error:

      org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
      compile_static_failure.groovy: 11: Access to Abstract#name is forbidden @ line 11, column 25.
           println "Y is called $y.name"
      1 error

      when executing the following coce:

      import groovy.transform.*
      def test() {
        I x = new ConcreteA()
        I y = System.currentTimeMillis() % 2 ? new ConcreteA() : new ConcreteB()
        println "X is called $x.name"
        println "Y is called $y.name"
      public class ConcreteA extends Abstract { 
        String name
      public class ConcreteB extends Abstract { 
        String name
      abstract class Abstract implements I { 
        //abstract String getName()
      interface I { 
        String getName()

      The same code (plus a few semicolons) compiles fine in Java and also runs fine without the CompileStatic annotation. I haven't analyzed this very deeply, but this feels like a bug in the CompileStatic implementation.

      An interesting note is that for the variable x in the above code, there are no issues when accessing x.name. It seems that the CompileStatic code does type analysis, comes to the conclusion that the concrete type of variable y is either ConcrecteA or ConcreteB, then proceeds to find the largest common deniminator for the two which is abstract class Abstract, and then proceeds to complain about the fact that Abstract does not have method/property 'name'.

      Commenting in the commented out 'abstract String getName()' method on class Abstract 'fixes' the error.



          This comment will be Viewable by All Users Viewable by All Users


            melix C├ędric Champeau
            mbjarland Matias Bjarland
            0 Vote for this issue
            2 Start watching this issue



              Issue deployment