Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Checker crashes on Record compact constructor if field has annotated generic parameter #6100

Closed
tmarback opened this issue Jul 17, 2023 · 0 comments · Fixed by #6109
Closed
Assignees
Labels

Comments

@tmarback
Copy link

If a record has a field whose type involves a generic parameter, and said parameter has an annotation on it, then creating a compact constructor causes Checker to crash. This code:

import org.checkerframework.checker.index.qual.NonNegative;
import java.util.List;

public record Foo( List<@NonNegative Integer> bar ) {

    public Foo {

        if ( bar.size() < 0 ) {
            throw new IllegalArgumentException();
        }

    }
    
}

With the command .\bin\javac.bat -processor nullness Foo.java -d out (Checker 3.36.0) gives the following error:

❯ .\bin\javac.bat -processor nullness Foo.java
error: Error in AnnotatedTypeMirror.fromExpression(KeyForAnnotatedTypeFactory, super): handleInvalid(this=org.checkerframework.framework.util.element.MethodApplier):
  Invalid variable and element passed to extractAndApply; type: Foo <init>(List p0)
    element: Foo(java.util.List<@org.checkerframework.checker.index.qual.NonNegative java.lang.Integer>) (kind: CONSTRUCTOR), invalid annotations: @org.checkerframework.checker.index.qual.NonNegative ([FIELD, location = (TYPE_ARGUMENT(0)), pos = 133])
  Targeted annotations: METHOD_RECEIVER, METHOD_RETURN, THROWS
  Valid annotations: LOCAL_VARIABLE, RESOURCE_VARIABLE, EXCEPTION_PARAMETER, NEW, CAST, INSTANCEOF, METHOD_INVOCATION_TYPE_ARGUMENT, CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT, METHOD_REFERENCE, CONSTRUCTOR_REFERENCE, METHOD_REFERENCE_TYPE_ARGUMENT, CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT, METHOD_TYPE_PARAMETER, METHOD_TYPE_PARAMETER_BOUND, METHOD_FORMAL_PARAMETER, CLASS_EXTENDS, UNKNOWN
  ; The Checker Framework crashed.  Please report the crash.
  Compilation unit: Foo.java
  Last visited tree at line 4 column 1:
  public record Foo( List<@NonNegative Integer> bar ) {
  Exception: org.checkerframework.javacutil.BugInCF: handleInvalid(this=org.checkerframework.framework.util.element.MethodApplier):
  Invalid variable and element passed to extractAndApply; type: Foo <init>(List p0)
    element: Foo(java.util.List<@org.checkerframework.checker.index.qual.NonNegative java.lang.Integer>) (kind: CONSTRUCTOR), invalid annotations: @org.checkerframework.checker.index.qual.NonNegative ([FIELD, location = (TYPE_ARGUMENT(0)), pos = 133])
  Targeted annotations: METHOD_RECEIVER, METHOD_RETURN, THROWS
  Valid annotations: LOCAL_VARIABLE, RESOURCE_VARIABLE, EXCEPTION_PARAMETER, NEW, CAST, INSTANCEOF, METHOD_INVOCATION_TYPE_ARGUMENT, CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT, METHOD_REFERENCE, CONSTRUCTOR_REFERENCE, METHOD_REFERENCE_TYPE_ARGUMENT, CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT, METHOD_TYPE_PARAMETER, METHOD_TYPE_PARAMETER_BOUND, METHOD_FORMAL_PARAMETER, CLASS_EXTENDS, UNKNOWN; org.checkerframework.javacutil.BugInCF: handleInvalid(this=org.checkerframework.framework.util.element.MethodApplier):
  Invalid variable and element passed to extractAndApply; type: Foo <init>(List p0)
    element: Foo(java.util.List<@org.checkerframework.checker.index.qual.NonNegative java.lang.Integer>) (kind: CONSTRUCTOR), invalid annotations: @org.checkerframework.checker.index.qual.NonNegative ([FIELD, location = (TYPE_ARGUMENT(0)), pos = 133])
  Targeted annotations: METHOD_RECEIVER, METHOD_RETURN, THROWS
  Valid annotations: LOCAL_VARIABLE, RESOURCE_VARIABLE, EXCEPTION_PARAMETER, NEW, CAST, INSTANCEOF, METHOD_INVOCATION_TYPE_ARGUMENT, CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT, METHOD_REFERENCE, CONSTRUCTOR_REFERENCE, METHOD_REFERENCE_TYPE_ARGUMENT, CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT, METHOD_TYPE_PARAMETER, METHOD_TYPE_PARAMETER_BOUND, METHOD_FORMAL_PARAMETER, CLASS_EXTENDS, UNKNOWN
        at org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.handleInvalid(TargetedElementAnnotationApplier.java:142)
        at org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.extractAndApply(TargetedElementAnnotationApplier.java:204)
        at org.checkerframework.framework.util.element.MethodApplier.extractAndApply(MethodApplier.java:145)
        at org.checkerframework.framework.util.element.MethodApplier.apply(MethodApplier.java:32)
        at org.checkerframework.framework.type.ElementAnnotationApplier.applyInternal(ElementAnnotationApplier.java:134)
        at org.checkerframework.framework.type.ElementAnnotationApplier.apply(ElementAnnotationApplier.java:83)
        at org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:133)
        at org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:29)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:953)
        at jdk.compiler/com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:81)
        at org.checkerframework.framework.type.TypeFromTree.fromMember(TypeFromTree.java:63)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.fromMember(AnnotatedTypeFactory.java:1587)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1349)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:3250)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getSelfType(AnnotatedTypeFactory.java:2114)
        at org.checkerframework.framework.type.TypeFromExpressionVisitor.visitIdentifier(TypeFromExpressionVisitor.java:224)
        at org.checkerframework.framework.type.TypeFromExpressionVisitor.visitIdentifier(TypeFromExpressionVisitor.java:77)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:2592)
        at jdk.compiler/com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:81)
        at org.checkerframework.framework.type.TypeFromTree.fromExpression(TypeFromTree.java:40)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.fromExpression(AnnotatedTypeFactory.java:1682)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1352)
        at org.checkerframework.framework.flow.CFAbstractTransfer.getValueFromFactory(CFAbstractTransfer.java:211)
        at org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:525)
        at org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:98)
        at org.checkerframework.dataflow.cfg.node.AbstractNodeVisitor.visitMethodAccess(AbstractNodeVisitor.java:240)
        at org.checkerframework.dataflow.cfg.node.MethodAccessNode.accept(MethodAccessNode.java:63)
        at org.checkerframework.dataflow.analysis.AbstractAnalysis.callTransferFunction(AbstractAnalysis.java:349)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.callTransferFunction(ForwardAnalysisImpl.java:377)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.performAnalysisBlock(ForwardAnalysisImpl.java:128)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.performAnalysis(ForwardAnalysisImpl.java:105)
        at org.checkerframework.framework.flow.CFAbstractAnalysis.performAnalysis(CFAbstractAnalysis.java:147)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1544)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysis(GenericAnnotatedTypeFactory.java:1444)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.checkAndPerformFlowAnalysis(GenericAnnotatedTypeFactory.java:1933)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:423)
        at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:536)
        at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:184)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
        at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:60)
        at org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:86)
        at org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1043)
        at org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:558)
        at org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:551)
        at org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
        at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:854)
        at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1394)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1351)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:946)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
        at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)
        at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)
  Caused by: java.lang.Throwable
        at org.checkerframework.javacutil.BugInCF.<init>(BugInCF.java:22)
        ... 54 more

  Underlying Exception: java.lang.Throwable; java.lang.Throwable
        at org.checkerframework.javacutil.BugInCF.<init>(BugInCF.java:22)
        at org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.handleInvalid(TargetedElementAnnotationApplier.java:142)
        at org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.extractAndApply(TargetedElementAnnotationApplier.java:204)
        at org.checkerframework.framework.util.element.MethodApplier.extractAndApply(MethodApplier.java:145)
        at org.checkerframework.framework.util.element.MethodApplier.apply(MethodApplier.java:32)
        at org.checkerframework.framework.type.ElementAnnotationApplier.applyInternal(ElementAnnotationApplier.java:134)
        at org.checkerframework.framework.type.ElementAnnotationApplier.apply(ElementAnnotationApplier.java:83)
        at org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:133)
        at org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:29)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:953)
        at jdk.compiler/com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:81)
        at org.checkerframework.framework.type.TypeFromTree.fromMember(TypeFromTree.java:63)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.fromMember(AnnotatedTypeFactory.java:1587)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1349)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:3250)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getSelfType(AnnotatedTypeFactory.java:2114)
        at org.checkerframework.framework.type.TypeFromExpressionVisitor.visitIdentifier(TypeFromExpressionVisitor.java:224)
        at org.checkerframework.framework.type.TypeFromExpressionVisitor.visitIdentifier(TypeFromExpressionVisitor.java:77)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:2592)
        at jdk.compiler/com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:81)
        at org.checkerframework.framework.type.TypeFromTree.fromExpression(TypeFromTree.java:40)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.fromExpression(AnnotatedTypeFactory.java:1682)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1352)
        at org.checkerframework.framework.flow.CFAbstractTransfer.getValueFromFactory(CFAbstractTransfer.java:211)
        at org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:525)
        at org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:98)
        at org.checkerframework.dataflow.cfg.node.AbstractNodeVisitor.visitMethodAccess(AbstractNodeVisitor.java:240)
        at org.checkerframework.dataflow.cfg.node.MethodAccessNode.accept(MethodAccessNode.java:63)
        at org.checkerframework.dataflow.analysis.AbstractAnalysis.callTransferFunction(AbstractAnalysis.java:349)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.callTransferFunction(ForwardAnalysisImpl.java:377)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.performAnalysisBlock(ForwardAnalysisImpl.java:128)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.performAnalysis(ForwardAnalysisImpl.java:105)
        at org.checkerframework.framework.flow.CFAbstractAnalysis.performAnalysis(CFAbstractAnalysis.java:147)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1544)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysis(GenericAnnotatedTypeFactory.java:1444)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.checkAndPerformFlowAnalysis(GenericAnnotatedTypeFactory.java:1933)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:423)
        at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:536)
        at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:184)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
        at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:60)
        at org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:86)
        at org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1043)
        at org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:558)
        at org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:551)
        at org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
        at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:854)
        at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1394)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1351)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:946)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
        at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)
        at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)
error: Error in AnnotatedTypeMirror.fromExpression(NullnessAnnotatedTypeFactory, super): handleInvalid(this=org.checkerframework.framework.util.element.MethodApplier):
  Invalid variable and element passed to extractAndApply; type: Foo <init>(List p0)
    element: Foo(java.util.List<@org.checkerframework.checker.index.qual.NonNegative java.lang.Integer>) (kind: CONSTRUCTOR), invalid annotations: @org.checkerframework.checker.index.qual.NonNegative ([FIELD, location = (TYPE_ARGUMENT(0)), pos = 133])
  Targeted annotations: METHOD_RECEIVER, METHOD_RETURN, THROWS
  Valid annotations: LOCAL_VARIABLE, RESOURCE_VARIABLE, EXCEPTION_PARAMETER, NEW, CAST, INSTANCEOF, METHOD_INVOCATION_TYPE_ARGUMENT, CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT, METHOD_REFERENCE, CONSTRUCTOR_REFERENCE, METHOD_REFERENCE_TYPE_ARGUMENT, CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT, METHOD_TYPE_PARAMETER, METHOD_TYPE_PARAMETER_BOUND, METHOD_FORMAL_PARAMETER, CLASS_EXTENDS, UNKNOWN
  ; The Checker Framework crashed.  Please report the crash.
  Compilation unit: Foo.java
  Last visited tree at line 4 column 1:
  public record Foo( List<@NonNegative Integer> bar ) {
  Exception: org.checkerframework.javacutil.BugInCF: handleInvalid(this=org.checkerframework.framework.util.element.MethodApplier):
  Invalid variable and element passed to extractAndApply; type: Foo <init>(List p0)
    element: Foo(java.util.List<@org.checkerframework.checker.index.qual.NonNegative java.lang.Integer>) (kind: CONSTRUCTOR), invalid annotations: @org.checkerframework.checker.index.qual.NonNegative ([FIELD, location = (TYPE_ARGUMENT(0)), pos = 133])
  Targeted annotations: METHOD_RECEIVER, METHOD_RETURN, THROWS
  Valid annotations: LOCAL_VARIABLE, RESOURCE_VARIABLE, EXCEPTION_PARAMETER, NEW, CAST, INSTANCEOF, METHOD_INVOCATION_TYPE_ARGUMENT, CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT, METHOD_REFERENCE, CONSTRUCTOR_REFERENCE, METHOD_REFERENCE_TYPE_ARGUMENT, CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT, METHOD_TYPE_PARAMETER, METHOD_TYPE_PARAMETER_BOUND, METHOD_FORMAL_PARAMETER, CLASS_EXTENDS, UNKNOWN; org.checkerframework.javacutil.BugInCF: handleInvalid(this=org.checkerframework.framework.util.element.MethodApplier):
  Invalid variable and element passed to extractAndApply; type: Foo <init>(List p0)
    element: Foo(java.util.List<@org.checkerframework.checker.index.qual.NonNegative java.lang.Integer>) (kind: CONSTRUCTOR), invalid annotations: @org.checkerframework.checker.index.qual.NonNegative ([FIELD, location = (TYPE_ARGUMENT(0)), pos = 133])
  Targeted annotations: METHOD_RECEIVER, METHOD_RETURN, THROWS
  Valid annotations: LOCAL_VARIABLE, RESOURCE_VARIABLE, EXCEPTION_PARAMETER, NEW, CAST, INSTANCEOF, METHOD_INVOCATION_TYPE_ARGUMENT, CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT, METHOD_REFERENCE, CONSTRUCTOR_REFERENCE, METHOD_REFERENCE_TYPE_ARGUMENT, CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT, METHOD_TYPE_PARAMETER, METHOD_TYPE_PARAMETER_BOUND, METHOD_FORMAL_PARAMETER, CLASS_EXTENDS, UNKNOWN
        at org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.handleInvalid(TargetedElementAnnotationApplier.java:142)
        at org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.extractAndApply(TargetedElementAnnotationApplier.java:204)
        at org.checkerframework.framework.util.element.MethodApplier.extractAndApply(MethodApplier.java:145)
        at org.checkerframework.framework.util.element.MethodApplier.apply(MethodApplier.java:32)
        at org.checkerframework.framework.type.ElementAnnotationApplier.applyInternal(ElementAnnotationApplier.java:134)
        at org.checkerframework.framework.type.ElementAnnotationApplier.apply(ElementAnnotationApplier.java:83)
        at org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:133)
        at org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:29)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:953)
        at jdk.compiler/com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:81)
        at org.checkerframework.framework.type.TypeFromTree.fromMember(TypeFromTree.java:63)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.fromMember(AnnotatedTypeFactory.java:1587)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1349)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:3250)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getSelfType(AnnotatedTypeFactory.java:2114)
        at org.checkerframework.checker.initialization.InitializationAnnotatedTypeFactory.getSelfType(InitializationAnnotatedTypeFactory.java:443)
        at org.checkerframework.framework.type.TypeFromExpressionVisitor.visitIdentifier(TypeFromExpressionVisitor.java:224)
        at org.checkerframework.framework.type.TypeFromExpressionVisitor.visitIdentifier(TypeFromExpressionVisitor.java:77)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:2592)
        at jdk.compiler/com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:81)
        at org.checkerframework.framework.type.TypeFromTree.fromExpression(TypeFromTree.java:40)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.fromExpression(AnnotatedTypeFactory.java:1682)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1352)
        at org.checkerframework.framework.flow.CFAbstractTransfer.getValueFromFactory(CFAbstractTransfer.java:211)
        at org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:525)
        at org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:98)
        at org.checkerframework.dataflow.cfg.node.AbstractNodeVisitor.visitMethodAccess(AbstractNodeVisitor.java:240)
        at org.checkerframework.checker.nullness.NullnessTransfer.visitMethodAccess(NullnessTransfer.java:340)
        at org.checkerframework.checker.nullness.NullnessTransfer.visitMethodAccess(NullnessTransfer.java:60)
        at org.checkerframework.dataflow.cfg.node.MethodAccessNode.accept(MethodAccessNode.java:63)
        at org.checkerframework.dataflow.analysis.AbstractAnalysis.callTransferFunction(AbstractAnalysis.java:349)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.callTransferFunction(ForwardAnalysisImpl.java:377)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.performAnalysisBlock(ForwardAnalysisImpl.java:128)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.performAnalysis(ForwardAnalysisImpl.java:105)
        at org.checkerframework.framework.flow.CFAbstractAnalysis.performAnalysis(CFAbstractAnalysis.java:147)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1544)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysis(GenericAnnotatedTypeFactory.java:1444)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.checkAndPerformFlowAnalysis(GenericAnnotatedTypeFactory.java:1933)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:423)
        at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:536)
        at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:184)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
        at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:60)
        at org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:86)
        at org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1043)
        at org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:558)
        at org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
        at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:854)
        at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1394)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1351)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:946)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
        at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)
        at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)
  Caused by: java.lang.Throwable
        at org.checkerframework.javacutil.BugInCF.<init>(BugInCF.java:22)
        ... 56 more

  Underlying Exception: java.lang.Throwable; java.lang.Throwable
        at org.checkerframework.javacutil.BugInCF.<init>(BugInCF.java:22)
        at org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.handleInvalid(TargetedElementAnnotationApplier.java:142)
        at org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.extractAndApply(TargetedElementAnnotationApplier.java:204)
        at org.checkerframework.framework.util.element.MethodApplier.extractAndApply(MethodApplier.java:145)
        at org.checkerframework.framework.util.element.MethodApplier.apply(MethodApplier.java:32)
        at org.checkerframework.framework.type.ElementAnnotationApplier.applyInternal(ElementAnnotationApplier.java:134)
        at org.checkerframework.framework.type.ElementAnnotationApplier.apply(ElementAnnotationApplier.java:83)
        at org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:133)
        at org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:29)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:953)
        at jdk.compiler/com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:81)
        at org.checkerframework.framework.type.TypeFromTree.fromMember(TypeFromTree.java:63)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.fromMember(AnnotatedTypeFactory.java:1587)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1349)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:3250)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getSelfType(AnnotatedTypeFactory.java:2114)
        at org.checkerframework.checker.initialization.InitializationAnnotatedTypeFactory.getSelfType(InitializationAnnotatedTypeFactory.java:443)
        at org.checkerframework.framework.type.TypeFromExpressionVisitor.visitIdentifier(TypeFromExpressionVisitor.java:224)
        at org.checkerframework.framework.type.TypeFromExpressionVisitor.visitIdentifier(TypeFromExpressionVisitor.java:77)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:2592)
        at jdk.compiler/com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:81)
        at org.checkerframework.framework.type.TypeFromTree.fromExpression(TypeFromTree.java:40)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.fromExpression(AnnotatedTypeFactory.java:1682)
        at org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1352)
        at org.checkerframework.framework.flow.CFAbstractTransfer.getValueFromFactory(CFAbstractTransfer.java:211)
        at org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:525)
        at org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:98)
        at org.checkerframework.dataflow.cfg.node.AbstractNodeVisitor.visitMethodAccess(AbstractNodeVisitor.java:240)
        at org.checkerframework.checker.nullness.NullnessTransfer.visitMethodAccess(NullnessTransfer.java:340)
        at org.checkerframework.checker.nullness.NullnessTransfer.visitMethodAccess(NullnessTransfer.java:60)
        at org.checkerframework.dataflow.cfg.node.MethodAccessNode.accept(MethodAccessNode.java:63)
        at org.checkerframework.dataflow.analysis.AbstractAnalysis.callTransferFunction(AbstractAnalysis.java:349)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.callTransferFunction(ForwardAnalysisImpl.java:377)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.performAnalysisBlock(ForwardAnalysisImpl.java:128)
        at org.checkerframework.dataflow.analysis.ForwardAnalysisImpl.performAnalysis(ForwardAnalysisImpl.java:105)
        at org.checkerframework.framework.flow.CFAbstractAnalysis.performAnalysis(CFAbstractAnalysis.java:147)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1544)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysis(GenericAnnotatedTypeFactory.java:1444)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.checkAndPerformFlowAnalysis(GenericAnnotatedTypeFactory.java:1933)
        at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:423)
        at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:536)
        at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:184)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
        at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:60)
        at org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:86)
        at org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1043)
        at org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:558)
        at org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
        at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:854)
        at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1394)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1351)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:946)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
        at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)
        at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)
2 errors

Writing a full canonical constructor instead compiles fine:

import org.checkerframework.checker.index.qual.NonNegative;
import java.util.List;

public record Foo( List<@NonNegative Integer> bar ) {

    public Foo( List<@NonNegative Integer> bar ) {

        if ( bar.size() < 0 ) {
            throw new IllegalArgumentException();
        }
        this.bar = bar;

    }
    
}

Removing the @NonNegative annotation also avoids the crash.

@tmarback tmarback changed the title Checker crashes on Record compact constructor if field has annotated generic type Checker crashes on Record compact constructor if field has annotated generic parameter Jul 17, 2023
@smillst smillst added the crash label Jul 17, 2023
@smillst smillst self-assigned this Jul 17, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants