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