diff --git a/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala b/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala index 50f8f319c55e..2de0a38c702c 100644 --- a/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala @@ -278,6 +278,7 @@ object JavaParsers { } def typ(): Tree = + annotations() optArrayBrackets { if (in.token == FINAL) in.nextToken() if (in.token == IDENTIFIER) { @@ -516,6 +517,7 @@ object JavaParsers { def typeParam(flags: FlagSet): TypeDef = atSpan(in.offset) { + annotations() val name = identForType() val hi = if (in.token == EXTENDS) { in.nextToken() ; bound() } else javaLangObject() TypeDef(name, TypeBoundsTree(EmptyTree, hi)).withMods(Modifiers(flags)) diff --git a/tests/pos/i11490/First.java b/tests/pos/i11490/First.java new file mode 100644 index 000000000000..cd3bd2560096 --- /dev/null +++ b/tests/pos/i11490/First.java @@ -0,0 +1,7 @@ +package i11490; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE_USE, ElementType.TYPE_PARAMETER }) +public @interface First {} \ No newline at end of file diff --git a/tests/pos/i11490/Second.java b/tests/pos/i11490/Second.java new file mode 100644 index 000000000000..d449a1bd9e13 --- /dev/null +++ b/tests/pos/i11490/Second.java @@ -0,0 +1,7 @@ +package i11490; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE_USE, ElementType.TYPE_PARAMETER }) +public @interface Second {} \ No newline at end of file diff --git a/tests/pos/i11490/Use.java b/tests/pos/i11490/Use.java new file mode 100644 index 000000000000..1ca1e6dc2821 --- /dev/null +++ b/tests/pos/i11490/Use.java @@ -0,0 +1,7 @@ +package i11490; + +import java.util.List; + +public class Use<@First T extends @Second List<@First @Second String>> { + public <@First S> @Second @First String method(@Second int a, @First @Second S b) { return ""; } +}