biddyweb / checker-framework

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

Generic Array Initializers #392

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
Reported by Sergey on Checker Framework developers list 

======================================================

Type system definition:
@TypeQualifier
@SubtypeOf({})
@DefaultQualifierInHierarchy
@InvisibleQualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface UnqualifiedCurrency
{
}

@TypeQualifier
@SubtypeOf(UnqualifiedCurrency.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE_USE, ElementType.TYPE_PARAMETER })
public @interface LimitCurrency
{
}

@TypeQualifier
@SubtypeOf(UnqualifiedCurrency.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE_USE, ElementType.TYPE_PARAMETER })
public @interface DefaultCurrency
{
}

@TypeQualifier
@SubtypeOf({ LimitCurrency.class, DefaultCurrency.class, 
UnqualifiedCurrency.class })
@ImplicitFor(trees = { Tree.Kind.NULL_LITERAL})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface BottomCurrency
{
}

But got assertion error while compiling code:

package sandbox;

public class Pair<F, S>
{
    private F first = null;

    private S second = null;

    public Pair(F first, S second)
    {
        this.first = first;
        this.second = second;
    }

    public Object[] getFields()
    {
        return new Object[] {first, second};
    }
}

Error looks like:

error: SourceChecker.typeProcess: unexpected Throwable (AssertionError) while 
processing /home/sergey/java/projects/test/src/main/java/sandbox/Pair.java; 
message: QualifierHierarchy.leastUpperBounds: tried to determine LUB with empty 
sets!
  Compilation unit: /home/sergey/java/projects/test/src/main/java/sandbox/Pair.java
  Exception: java.lang.AssertionError: QualifierHierarchy.leastUpperBounds: tried to determine LUB with empty sets!; Stack trace: org.checkerframework.framework.type.QualifierHierarchy.leastUpperBounds(QualifierHierarchy.java:152)
  org.checkerframework.framework.type.PropagationTreeAnnotator.visitNewArray(PropagationTreeAnnotator.java:76)
  org.checkerframework.framework.type.PropagationTreeAnnotator.visitNewArray(PropagationTreeAnnotator.java:47)
  com.sun.tools.javac.tree.JCTree$JCNewArray.accept(JCTree.java:1574)
  com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:53)
  org.checkerframework.framework.type.ListTreeAnnotator.defaultAction(ListTreeAnnotator.java:36)
  org.checkerframework.framework.type.ListTreeAnnotator.defaultAction(ListTreeAnnotator.java:19)
  com.sun.source.util.SimpleTreeVisitor.visitNewArray(SimpleTreeVisitor.java:173)
  com.sun.tools.javac.tree.JCTree$JCNewArray.accept(JCTree.java:1574)
  com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:53)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.annotateImplicit(GenericAnnotatedTypeFactory.java:811)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.annotateImplicit(GenericAnnotatedTypeFactory.java:792)
  org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:597)
  org.checkerframework.framework.flow.CFAbstractTransfer.getValueFromFactory(CFAbstractTransfer.java:174)
  org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:484)
  org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:98)
  org.checkerframework.dataflow.cfg.node.AbstractNodeVisitor.visitArrayCreation(AbstractNodeVisitor.java:347)
  org.checkerframework.dataflow.cfg.node.ArrayCreationNode.accept(ArrayCreationNode.java:71)
  org.checkerframework.dataflow.analysis.Analysis.callTransferFunction(Analysis.java:364)
  org.checkerframework.dataflow.analysis.Analysis.performAnalysis(Analysis.java:201)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:677)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:648)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysis(GenericAnnotatedTypeFactory.java:594)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.checkAndPerformFlowAnalysis(GenericAnnotatedTypeFactory.java:841)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.annotateImplicit(GenericAnnotatedTypeFactory.java:808)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.annotateImplicit(GenericAnnotatedTypeFactory.java:792)
  org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:597)
  org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1645)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:277)
  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:823)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:412)
  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)
1 error

Iteratively I found workaround for method getFields. Both alternative 
implementation compiles without assertion error:
    public Object[] getFields()
    {
        Object[] retVal = new Object[2];
        retVal[0] = first;
        retVal[1] = second;
        return retVal;
    }

    public Object[] getFields()
    {
        return new Object[] {(Object)first, (Object)second};
    }

Original issue reported on code.google.com by mcart...@cs.washington.edu on 23 Jan 2015 at 5:18

GoogleCodeExporter commented 9 years ago
The root cause was that we were not handling multiple type variables used in an 
array initializer.

Original comment by mcart...@cs.washington.edu on 26 Jan 2015 at 11:01

GoogleCodeExporter commented 9 years ago
Fixed in release 1.8.10 of the Checker Framework.

Original comment by mcart...@cs.washington.edu on 30 Jan 2015 at 10:57