biddyweb / checker-framework

Automatically exported from code.google.com/p/checker-framework
Other
0 stars 1 forks source link

Another crash in TypeHierarchy.isSubtype #378

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
This could be related to 
https://code.google.com/p/checker-framework/issues/detail?id=313, but the repro 
is different.

=== a/Listener.java ===
package a;

public interface Listener<D> {
  void onUpdate(D value);
}
===

=== a/StringListener.java ===
package a;

import java.util.List;

public interface StringListener extends Listener<List<? extends String>> {
}
===

=== Test.java ===
import a.*;
import java.util.*;

class Test {
  private void m() {
    StringListener listener = new StringListener() {
      @Override public void onUpdate(List<? extends String> strings) {}
    };
  }
}
===

$ unzip repro.zip
$ javac a/*.java
$ jar cvf lib.jar a/*.class
$ ~/jsr308/checker-framework-1.8.7/checker/bin/javac -version -AprintErrorStack 
-processor org.checkerframework.checker.nullness.NullnessChecker -cp lib.jar 
Test.java

javac 1.8.0-jsr308-1.8.7
error: Found exception during TypeHierarchy.isSubtype of @Initialized @NonNull 
List<? extends String> and @Initialized @NonNull List<? extends @Initialized 
@NonNull String>
  Compilation unit: Test.java
  Exception: java.lang.AssertionError: Found invalid number of annotations on rhsBase String; comparing lhs: @Initialized @NonNull String rhs: String; expected number: 2; Stack trace: org.checkerframework.framework.type.TypeHierarchy.isSubtypeImpl(TypeHierarchy.java:285)
  org.checkerframework.framework.type.TypeHierarchy.isSubtypeAsTypeArgument(TypeHierarchy.java:530)
  org.checkerframework.framework.type.TypeHierarchy.isSubtypeTypeArguments(TypeHierarchy.java:459)
  org.checkerframework.framework.type.TypeHierarchy.isSubtypeImpl(TypeHierarchy.java:296)
  org.checkerframework.framework.type.TypeHierarchy.isSubtype(TypeHierarchy.java:86)
  org.checkerframework.common.basetype.BaseTypeVisitor$OverrideChecker.checkParameters(BaseTypeVisitor.java:2279)
  org.checkerframework.common.basetype.BaseTypeVisitor$OverrideChecker.checkOverride(BaseTypeVisitor.java:2084)
  org.checkerframework.common.basetype.BaseTypeVisitor.checkOverride(BaseTypeVisitor.java:1877)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitMethod(BaseTypeVisitor.java:431)
  org.checkerframework.checker.initialization.InitializationVisitor.visitMethod(InitializationVisitor.java:372)
  org.checkerframework.checker.initialization.InitializationVisitor.visitMethod(InitializationVisitor.java:57)
  com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:800)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.scan(TreeScanner.java:91)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:99)
  com.sun.source.util.TreeScanner.visitClass(TreeScanner.java:133)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:304)
  org.checkerframework.checker.initialization.InitializationVisitor.visitClass(InitializationVisitor.java:314)
  org.checkerframework.checker.initialization.InitializationVisitor.visitClass(InitializationVisitor.java:57)
  com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.visitNewClass(TreeScanner.java:280)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitNewClass(BaseTypeVisitor.java:1147)
  org.checkerframework.checker.nullness.NullnessVisitor.visitNewClass(NullnessVisitor.java:543)
  org.checkerframework.checker.nullness.NullnessVisitor.visitNewClass(NullnessVisitor.java:58)
  com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1532)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.visitVariable(TreeScanner.java:153)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitVariable(BaseTypeVisitor.java:769)
  org.checkerframework.checker.initialization.InitializationVisitor.visitVariable(InitializationVisitor.java:174)
  org.checkerframework.checker.initialization.InitializationVisitor.visitVariable(InitializationVisitor.java:57)
  com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:864)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scan(TreeScanner.java:91)
  com.sun.source.util.TreeScanner.visitBlock(TreeScanner.java:162)
  org.checkerframework.checker.initialization.InitializationVisitor.visitBlock(InitializationVisitor.java:282)
  org.checkerframework.checker.initialization.InitializationVisitor.visitBlock(InitializationVisitor.java:57)
  com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:918)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.visitMethod(TreeScanner.java:144)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitMethod(BaseTypeVisitor.java:439)
  org.checkerframework.checker.initialization.InitializationVisitor.visitMethod(InitializationVisitor.java:372)
  org.checkerframework.checker.initialization.InitializationVisitor.visitMethod(InitializationVisitor.java:57)
  com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:800)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.scan(TreeScanner.java:91)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:99)
  com.sun.source.util.TreeScanner.visitClass(TreeScanner.java:133)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:304)
  org.checkerframework.checker.initialization.InitializationVisitor.visitClass(InitializationVisitor.java:314)
  org.checkerframework.checker.initialization.InitializationVisitor.visitClass(InitializationVisitor.java:57)
  com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:50)
  org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:70)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:811)
  org.checkerframework.framework.source.AggregateChecker.typeProcess(AggregateChecker.java:123)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:205)
  com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:681)
  com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:111)
  com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1342)
  com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1296)
  com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901)
  com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860)
  com.sun.tools.javac.main.Main.compile(Main.java:523)
  com.sun.tools.javac.main.Main.compile(Main.java:381)
  com.sun.tools.javac.main.Main.compile(Main.java:370)
  com.sun.tools.javac.main.Main.compile(Main.java:361)
  com.sun.tools.javac.Main.compile(Main.java:56)
  com.sun.tools.javac.Main.main(Main.java:42)
error: Found exception during TypeHierarchy.isSubtype of List<? extends String> 
and List<? extends String>
  Compilation unit: Test.java
  Exception: java.lang.AssertionError: Found invalid number of annotations on rhsBase String; comparing lhs: String rhs: String; expected number: 1; Stack trace: org.checkerframework.framework.type.TypeHierarchy.isSubtypeImpl(TypeHierarchy.java:285)
  org.checkerframework.framework.type.TypeHierarchy.isSubtypeAsTypeArgument(TypeHierarchy.java:530)
  org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory$KeyForTypeHierarchy.isSubtypeTypeArguments(KeyForAnnotatedTypeFactory.java:320)
  org.checkerframework.framework.type.TypeHierarchy.isSubtypeImpl(TypeHierarchy.java:296)
  org.checkerframework.framework.type.TypeHierarchy.isSubtype(TypeHierarchy.java:86)
  org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory$KeyForTypeHierarchy.isSubtype(KeyForAnnotatedTypeFactory.java:265)
  org.checkerframework.common.basetype.BaseTypeVisitor$OverrideChecker.checkParameters(BaseTypeVisitor.java:2279)
  org.checkerframework.common.basetype.BaseTypeVisitor$OverrideChecker.checkOverride(BaseTypeVisitor.java:2084)
  org.checkerframework.common.basetype.BaseTypeVisitor.checkOverride(BaseTypeVisitor.java:1877)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitMethod(BaseTypeVisitor.java:431)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitMethod(BaseTypeVisitor.java:165)
  com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:800)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.scan(TreeScanner.java:91)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:99)
  com.sun.source.util.TreeScanner.visitClass(TreeScanner.java:133)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:304)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:165)
  com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.visitNewClass(TreeScanner.java:280)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitNewClass(BaseTypeVisitor.java:1147)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitNewClass(BaseTypeVisitor.java:165)
  com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1532)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.visitVariable(TreeScanner.java:153)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitVariable(BaseTypeVisitor.java:769)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitVariable(BaseTypeVisitor.java:165)
  com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:864)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scan(TreeScanner.java:91)
  com.sun.source.util.TreeScanner.visitBlock(TreeScanner.java:162)
  com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:918)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.visitMethod(TreeScanner.java:144)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitMethod(BaseTypeVisitor.java:439)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitMethod(BaseTypeVisitor.java:165)
  com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:800)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:254)
  org.checkerframework.common.basetype.BaseTypeVisitor.scan(BaseTypeVisitor.java:165)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:81)
  com.sun.source.util.TreeScanner.scan(TreeScanner.java:91)
  com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:99)
  com.sun.source.util.TreeScanner.visitClass(TreeScanner.java:133)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:304)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:165)
  com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:50)
  org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:70)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:811)
  org.checkerframework.framework.source.AggregateChecker.typeProcess(AggregateChecker.java:123)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:205)
  com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:681)
  com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:111)
  com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1342)
  com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1296)
  com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901)
  com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860)
  com.sun.tools.javac.main.Main.compile(Main.java:523)
  com.sun.tools.javac.main.Main.compile(Main.java:381)
  com.sun.tools.javac.main.Main.compile(Main.java:370)
  com.sun.tools.javac.main.Main.compile(Main.java:361)
  com.sun.tools.javac.Main.compile(Main.java:56)
  com.sun.tools.javac.Main.main(Main.java:42)
2 errors

Original issue reported on code.google.com by cus...@google.com on 18 Nov 2014 at 5:57

Attachments:

GoogleCodeExporter commented 9 years ago
I reproduced this using the head of code.google.com/p/checker-framework.

For developers:
This issues appears to be fixed in the type-variable fixup repo.  

Original comment by Jonathan...@gmail.com on 18 Nov 2014 at 8:14

GoogleCodeExporter commented 9 years ago
That's great that the type-variable fixup repo has already corrected this issue.

For Liam and others who may be interested:  We have done a great deal of work 
to correct long-standing and subtle issues with how the Checker Framework 
handles type variables.  These changes are a great improvement, but they aren't 
ready for general release yet.  We plan to merge those changes into the 
mainline Checker Framework repository in December, so they will appear in the 
January 1 release.

I realize that doesn't help you in the short term, but at least you know that a 
fix is on the way.

(To the developers:  could someone please commit this as a test case that 
mentions this issue, leave a comment here saying what the test case is, and 
disable the test case for now?  Thanks.)

Original comment by michael.ernst@gmail.com on 19 Nov 2014 at 4:28

GoogleCodeExporter commented 9 years ago

Original comment by Jonathan...@gmail.com on 8 Apr 2015 at 9:04

GoogleCodeExporter commented 9 years ago

Original comment by jtha...@cs.washington.edu on 18 Apr 2015 at 6:42