Skip to content

[java] java.lang.IllegalArgumentException: Invalid target type of type annotation for method or ctor type annotation: 19 #6256

@estekhin

Description

@estekhin

Hello!

There is a bug in javac https://bugs.openjdk.org/browse/JDK-8372382 related to incorrect RuntimeVisibleTypeAnnotations section in byte code - in some edge situations javac generates constructor marked with FIELD annotation instead of METHOD_FORMAL_PARAMETER annotation.

reproducer code:

package demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public record RuntimeVisibleTypeAnnotationsOuter(
    Id id
) {
    public RuntimeVisibleTypeAnnotationsOuter {
    }

    public record Id(
        String id
    ) {
    }

    public record Inner(
        Id id
    ) {
        public Inner {
        }

        public record Id(
            @Anno String value,
            RuntimeVisibleTypeAnnotationsOuter.@Anno Id outerId
        ) {
            public Id {
            }
        }
    }

    @Target(ElementType.TYPE_USE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Anno {
    }
}

If there is any code that uses RuntimeVisibleTypeAnnotationsOuter.Inner.Id, then pmd-mavn-plugin + PMD will log something like

[ERROR] Parsing failed in ParseLock#doParse()
org.apache.commons.lang3.exception.ContextedRuntimeException: java.lang.IllegalArgumentException: Invalid target type of type annotation @demo.RuntimeVisibleTypeAnnotationsOuter.Anno for method or ctor type annotation: 19
---------------------------------
    at net.sourceforge.pmd.util.AssertionUtil.contexted (AssertionUtil.java:257)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse (GenericSigBase.java:62)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus (ParseLock.java:62)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed (ParseLock.java:29)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed (GenericSigBase.java:92)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.getTypeParams (GenericSigBase.java:112)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getTypeParameters (ExecutableStub.java:60)
    at net.sourceforge.pmd.lang.java.types.ClassMethodSigImpl.getTypeParameters (ClassMethodSigImpl.java:121)
    at net.sourceforge.pmd.lang.java.types.JMethodSig.isGeneric (JMethodSig.java:161)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.isPotentiallyApplicable (Infer.java:1024)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:302)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ast.BaseInvocMirror.getStandaloneCtdecl (BaseInvocMirror.java:82)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ast.CtorInvocMirror.finishStandaloneInference (CtorInvocMirror.java:61)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ExprCheckHelper.isCompatible (ExprCheckHelper.java:103)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addBoundOrDefer (Infer.java:945)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addArgsConstraints (Infer.java:903)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer (Infer.java:531)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod (Infer.java:415)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateConstructor (Infer.java:446)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor (Infer.java:394)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference (Infer.java:377)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:317)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ast.BaseInvocMirror.getStandaloneCtdecl (BaseInvocMirror.java:82)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ast.CtorInvocMirror.finishStandaloneInference (CtorInvocMirror.java:61)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ExprCheckHelper.isCompatible (ExprCheckHelper.java:103)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addBoundOrDefer (Infer.java:945)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addArgsConstraints (Infer.java:903)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateImpl (Infer.java:593)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer (Infer.java:571)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod (Infer.java:415)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor (Infer.java:395)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference (Infer.java:377)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:317)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.goToInvocationWithFallback (Infer.java:208)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.inferInvocationRecursively (Infer.java:170)
    at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.inferInvocation (PolyResolution.java:263)
    at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.polyTypeOtherCtx (PolyResolution.java:135)
    at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.computePolyType (PolyResolution.java:125)
    at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.handlePoly (LazyTypeResolver.java:360)
    at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit (LazyTypeResolver.java:365)
    at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit (LazyTypeResolver.java:103)
    at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.acceptVisitor (ASTMethodCall.java:71)
    at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror (AbstractJavaTypeNode.java:51)
    at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror (ASTMethodCall.java:22)
    at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror (AbstractJavaTypeNode.java:39)
    at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror (ASTMethodCall.java:22)
    at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.lambda$forceTypeResolutionPhase$0 (InternalApiBridge.java:92)
    at java.util.Iterator.forEachRemaining (Iterator.java:133)
    at net.sourceforge.pmd.lang.ast.internal.IteratorBasedNStream.forEach (IteratorBasedNStream.java:102)
    at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.forceTypeResolutionPhase (InternalApiBridge.java:90)
    at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$3 (JavaAstProcessor.java:140)
    at net.sourceforge.pmd.benchmark.TimeTracker.bench (TimeTracker.java:163)
    at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:140)
    at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:171)
    at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:155)
    at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl (JavaParser.java:70)
    at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl (JavaParser.java:25)
    at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse (JjtreeParserAdapter.java:36)
    at net.sourceforge.pmd.lang.impl.PmdRunnable.parse (PmdRunnable.java:112)
    at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource (PmdRunnable.java:132)
    at net.sourceforge.pmd.lang.impl.PmdRunnable.run (PmdRunnable.java:80)
    at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:545)
    at java.util.concurrent.FutureTask.run (FutureTask.java:328)
    at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1090)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:614)
    at java.lang.Thread.run (Thread.java:1474)
Caused by: java.lang.IllegalArgumentException: Invalid target type of type annotation @demo.RuntimeVisibleTypeAnnotationsOuter.Anno for method or ctor type annotation: 19
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.acceptAnnotationAfterParse (GenericSigBase.java:426)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeAnnotationHelper$TypeAnnotationSetWithReferences.forEach (TypeAnnotationHelper.java:71)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.doParse (GenericSigBase.java:288)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse (GenericSigBase.java:59)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus (ParseLock.java:62)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed (ParseLock.java:29)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed (GenericSigBase.java:92)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.getTypeParams (GenericSigBase.java:112)
    at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getTypeParameters (ExecutableStub.java:60)
    at net.sourceforge.pmd.lang.java.types.ClassMethodSigImpl.getTypeParameters (ClassMethodSigImpl.java:121)
    at net.sourceforge.pmd.lang.java.types.JMethodSig.isGeneric (JMethodSig.java:161)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.isPotentiallyApplicable (Infer.java:1024)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:302)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ast.BaseInvocMirror.getStandaloneCtdecl (BaseInvocMirror.java:82)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ast.CtorInvocMirror.finishStandaloneInference (CtorInvocMirror.java:61)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ExprCheckHelper.isCompatible (ExprCheckHelper.java:103)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addBoundOrDefer (Infer.java:945)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addArgsConstraints (Infer.java:903)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer (Infer.java:531)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod (Infer.java:415)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateConstructor (Infer.java:446)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor (Infer.java:394)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference (Infer.java:377)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:317)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ast.BaseInvocMirror.getStandaloneCtdecl (BaseInvocMirror.java:82)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ast.CtorInvocMirror.finishStandaloneInference (CtorInvocMirror.java:61)
    at net.sourceforge.pmd.lang.java.types.internal.infer.ExprCheckHelper.isCompatible (ExprCheckHelper.java:103)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addBoundOrDefer (Infer.java:945)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addArgsConstraints (Infer.java:903)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateImpl (Infer.java:593)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer (Infer.java:571)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod (Infer.java:415)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor (Infer.java:395)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference (Infer.java:377)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:317)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.goToInvocationWithFallback (Infer.java:208)
    at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.inferInvocationRecursively (Infer.java:170)
    at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.inferInvocation (PolyResolution.java:263)
    at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.polyTypeOtherCtx (PolyResolution.java:135)
    at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.computePolyType (PolyResolution.java:125)
    at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.handlePoly (LazyTypeResolver.java:360)
    at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit (LazyTypeResolver.java:365)
    at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit (LazyTypeResolver.java:103)
    at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.acceptVisitor (ASTMethodCall.java:71)
    at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror (AbstractJavaTypeNode.java:51)
    at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror (ASTMethodCall.java:22)
    at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror (AbstractJavaTypeNode.java:39)
    at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror (ASTMethodCall.java:22)
    at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.lambda$forceTypeResolutionPhase$0 (InternalApiBridge.java:92)
    at java.util.Iterator.forEachRemaining (Iterator.java:133)
    at net.sourceforge.pmd.lang.ast.internal.IteratorBasedNStream.forEach (IteratorBasedNStream.java:102)
    at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.forceTypeResolutionPhase (InternalApiBridge.java:90)
    at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$3 (JavaAstProcessor.java:140)
    at net.sourceforge.pmd.benchmark.TimeTracker.bench (TimeTracker.java:163)
    at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:140)
    at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:171)
    at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:155)
    at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl (JavaParser.java:70)
    at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl (JavaParser.java:25)
    at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse (JjtreeParserAdapter.java:36)
    at net.sourceforge.pmd.lang.impl.PmdRunnable.parse (PmdRunnable.java:112)
    at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource (PmdRunnable.java:132)
    at net.sourceforge.pmd.lang.impl.PmdRunnable.run (PmdRunnable.java:80)
    at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:545)
    at java.util.concurrent.FutureTask.run (FutureTask.java:328)
    at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1090)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:614)
    at java.lang.Thread.run (Thread.java:1474)

This is similar to #5344 , and probably warrants the same type of "fix" - log/warn about bogus FIELD annotation.

Metadata

Metadata

Assignees

No one assigned

    Labels

    a:bugPMD crashes or fails to analyse a file.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions