RFR: JDK-8193367: Annotated type variable bounds crash javac

B. Blaser bsrbnd at gmail.com
Mon Jun 11 14:42:46 UTC 2018


Hi,

By the light of Maurizio's JBS comment [1], I suggest the following
fix which virtualizes and overrides 'TypeVar.bound()' in the cloned
type var and uses it in 'Types.getBounds()'.

Any comment is welcome (langtools:tier1 is OK),
Bernard

[1] https://bugs.openjdk.java.net/browse/JDK-8193367


diff -r 65e65d5905bc
src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java
   Sun Jun 10 12:58:38 2018 +0300
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java
   Mon Jun 11 15:50:12 2018 +0200
@@ -1636,11 +1636,16 @@
             this.lower = lower;
         }

+        public Type bound() { return bound; }
+
         @Override
         public TypeVar cloneWithMetadata(TypeMetadata md) {
             return new TypeVar(tsym, bound, lower, md) {
                 @Override
                 public Type baseType() { return TypeVar.this.baseType(); }
+
+                @Override
+                public Type bound() { return TypeVar.this.bound; }
             };
         }

diff -r 65e65d5905bc
src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java
   Sun Jun 10 12:58:38 2018 +0300
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java
   Mon Jun 11 15:50:12 2018 +0200
@@ -2666,10 +2666,10 @@
      * Return list of bounds of the given type variable.
      */
     public List<Type> getBounds(TypeVar t) {
-        if (t.bound.hasTag(NONE))
+        if (t.bound().hasTag(NONE))
             return List.nil();
-        else if (t.bound.isErroneous() || !t.bound.isCompound())
-            return List.of(t.bound);
+        else if (t.bound().isErroneous() || !t.bound().isCompound())
+            return List.of(t.bound());
         else if ((erasure(t).tsym.flags() & INTERFACE) == 0)
             return interfaces(t).prepend(supertype(t));
         else
diff -r 65e65d5905bc
test/langtools/tools/javac/generics/typevars/AnnoTypeVarBounds.java
--- /dev/null    Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/generics/typevars/AnnoTypeVarBounds.java
   Mon Jun 11 15:50:12 2018 +0200
@@ -0,0 +1,15 @@
+/*
+ * @test
+ * @bug     8193367
+ * @summary Annotated type variable bounds crash javac
+ * @compile AnnoTypeVarBounds.java
+ */
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+class AnnoTypeVarBounds {
+    @Target(value = {ElementType.TYPE_USE})
+    @interface A{}
+    class Sup<X, Y> { }
+    class Sub<U extends @A V, @A V extends String> extends Sup<U, V> { }
+}


More information about the compiler-dev mailing list