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

STC crashes when bound has two wildcard types as type arguments

    XMLWordPrintableJSON

Details

    Description

      I have the following Groovy program.

      @groovy.transform.CompileStatic
      class Main {
        public static final void main() {
          final def x = ((B) null).foo(new A<>(), new A<>())
        }
      }
      
      class A<O, S> {}
      
      interface B {
        abstract <F_P extends A<? extends Number, ? extends Number>> void foo(F_P y, F_P z)
      }
      
      

      Actual Behavior

      The compiler crashes with the following stacktrace

      >>> a serious error occurred: BUG! exception in phase 'instruction selection' in source unit 'Main.groovy' Expected earlier checking to detect generics parameter arity mismatch
      Expected: A<O,S>
      Supplied: A<F_P extends A<? extends java.lang.Number, ? extends java.lang.Number>>
      >>> stacktrace:
      BUG! exception in phase 'instruction selection' in source unit 'Main.groovy' Expected earlier checking to detect generics parameter arity mismatch
      Expected: A<O,S>
      Supplied: A<F_P extends A<? extends java.lang.Number, ? extends java.lang.Number>>
              at org.codehaus.groovy.ast.tools.GenericsUtils.extractPlaceholders(GenericsUtils.java:195)
              at org.codehaus.groovy.ast.tools.GenericsUtils.extractPlaceholders(GenericsUtils.java:146)
              at org.codehaus.groovy.ast.GenericsType.compareGenericsWithBound(GenericsType.java:368)
              at org.codehaus.groovy.ast.GenericsType.checkGenerics(GenericsType.java:292)
              at org.codehaus.groovy.ast.GenericsType.isCompatibleWith(GenericsType.java:244)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.applyGenericsConnections(StaticTypeCheckingSupport.java:1622)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.inferenceCheck(StaticTypeCheckingSupport.java:1528)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.typeCheckMethodsWithGenerics(StaticTypeCheckingSupport.java:1467)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.typeCheckMethodsWithGenerics(StaticTypeCheckingSupport.java:1415)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.typeCheckMethodsWithGenericsOrFail(StaticTypeCheckingVisitor.java:5712)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitMethodCallExpression(StaticTypeCheckingVisitor.java:3524)
              at org.codehaus.groovy.transform.sc.StaticCompilationVisitor.visitMethodCallExpression(StaticCompilationVisitor.java:414)
              at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:77)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitBinaryExpression(StaticTypeCheckingVisitor.java:791)
              at org.codehaus.groovy.ast.CodeVisitorSupport.visitDeclarationExpression(CodeVisitorSupport.java:335)
              at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitDeclarationExpression(ClassCodeVisitorSupport.java:154)
              at org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89)
              at org.codehaus.groovy.ast.CodeVisitorSupport.visitExpressionStatement(CodeVisitorSupport.java:117)
              at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitExpressionStatement(ClassCodeVisitorSupport.java:204)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitExpressionStatement(StaticTypeCheckingVisitor.java:2190)
              at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:41)
              at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:86)
              at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:168)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitBlockStatement(StaticTypeCheckingVisitor.java:3935)
              at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:70)
              at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:142)
              at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:115)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitConstructorOrMethod(StaticTypeCheckingVisitor.java:2596)
              at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:110)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.startMethodInference(StaticTypeCheckingVisitor.java:2585)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitMethod(StaticTypeCheckingVisitor.java:2559)
              at org.codehaus.groovy.transform.sc.StaticCompilationVisitor.visitMethod(StaticCompilationVisitor.java:239)
              at org.codehaus.groovy.ast.ClassNode.visitMethods(ClassNode.java:1134)
              at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1127)
              at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:52)
              at org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitClass(StaticTypeCheckingVisitor.java:438)
              at org.codehaus.groovy.transform.sc.StaticCompilationVisitor.visitClass(StaticCompilationVisitor.java:197)
              at org.codehaus.groovy.transform.sc.StaticCompileTransformation.visit(StaticCompileTransformation.java:68)
              at org.codehaus.groovy.transform.ASTTransformationVisitor.visitClass(ASTTransformationVisitor.java:146)
              at org.codehaus.groovy.transform.ASTTransformationVisitor.lambda$addPhaseOperations$2(ASTTransformationVisitor.java:229)
              at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:911)
              at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:653)
              at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:630)
              at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:609)
              at org.codehaus.groovy.tools.FileSystemCompiler.compile(FileSystemCompiler.java:311)
              at org.codehaus.groovy.tools.FileSystemCompiler.doCompilation(FileSystemCompiler.java:240)
              at org.codehaus.groovy.tools.FileSystemCompiler.commandLineCompile(FileSystemCompiler.java:165)
              at org.codehaus.groovy.tools.FileSystemCompiler.commandLineCompileWithErrorHandling(FileSystemCompiler.java:205)
              at org.codehaus.groovy.tools.FileSystemCompiler.main(FileSystemCompiler.java:189)
      
      

      Comment

      javac rejects the equivalent Java program because it cannot infer the type for variable x. I'm not sure if groovyc could infer the type of this variable.

      Affected Version

      master (commit: cee45d768bb65d1254a61a6dd4ce3c6a1f2ee3ca ).

      Attachments

        Activity

          People

            emilles Eric Milles
            schaliasos Stefanos Chaliasos
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: