Stefanos Chaliasos created GROOVY-10344:
-------------------------------------------

             Summary: STC crashes when bound has two wildcard types as type 
arguments
                 Key: GROOVY-10344
                 URL: https://issues.apache.org/jira/browse/GROOVY-10344
             Project: Groovy
          Issue Type: Bug
          Components: Static compilation, Static Type Checker
    Affects Versions: 4.0.0-beta-1
            Reporter: Stefanos Chaliasos


I have the following Groovy program.
{code:groovy}
@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)
}

{code}
h2. Actual Behavior

The compiler crashes with the following stacktrace
{code:java}
>>> 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)

{code}
h2. Comment

The 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


h2. Affected Version

master (commit: cee45d768bb65d1254a61a6dd4ce3c6a1f2ee3ca ).



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to