Bug 532137 - Todays update produces compile error but javac compiles
fine
Change-Id: I027565881b29aac4d1593b694c6fd34c8deb49c8
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
index 2d10431..2bb35cf 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
@@ -6297,5 +6297,80 @@
"", "", null
);
}
+public void testBug532137() {
+ runConformTest(
+ new String[] {
+ "subtypes/A.java",
+ "package subtypes;\n" +
+ "\n" +
+ "\n" +
+ "public abstract class A<R extends B> {\n" +
+ "\n" +
+ " public A() {\n" +
+ "\n" +
+ " }\n" +
+ "\n" +
+ "}\n" +
+ "",
+ "subtypes/B.java",
+ "package subtypes;\n" +
+ "\n" +
+ "public abstract class B {\n" +
+ "\n" +
+ " public B() {\n" +
+ "\n" +
+ " }\n" +
+ "\n" +
+ "}\n" +
+ "",
+ "subtypes/GenericType.java",
+ "package subtypes;\n" +
+ "public abstract class GenericType<REQ extends A<RES>, RES extends B> {\n" +
+ "\n" +
+ "}\n" +
+ "",
+ "subtypes/TestBase.java",
+ "package subtypes;\n" +
+ "\n" +
+ "import java.util.Collections;\n" +
+ "import java.util.List;\n" +
+ "\n" +
+ "public abstract class TestBase {\n" +
+ "\n" +
+ " @SuppressWarnings(\"rawtypes\")\n" +
+ " protected List<Class<? extends GenericType>> giveMeAListOfTypes() {\n" +
+ " return Collections.emptyList();\n" +
+ " }\n" +
+ "\n" +
+ "}\n" +
+ "",
+ }
+ );
+ runNegativeTest(
+ new String[] {
+ "subtypes/TestImpl.java",
+ "package subtypes;\n" +
+ "\n" +
+ "import java.util.List;\n" +
+ "\n" +
+ "public class TestImpl extends TestBase{\n" +
+ "\n" +
+ " @Override\n" +
+ " protected List<Class<? extends GenericType>> giveMeAListOfTypes() {\n" +
+ " return super.giveMeAListOfTypes();\n" +
+ " }\n" +
+ "}\n" +
+ "",
+ },
+ "----------\n" +
+ "1. WARNING in subtypes\\TestImpl.java (at line 8)\n" +
+ " protected List<Class<? extends GenericType>> giveMeAListOfTypes() {\n" +
+ " ^^^^^^^^^^^\n" +
+ "GenericType is a raw type. References to generic type GenericType<REQ,RES> should be parameterized\n" +
+ "----------\n",
+ null,
+ false
+ );
+}
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java
index f6dedd1..7cc939f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java
@@ -187,7 +187,7 @@
throw new IllegalStateException();
WildcardBinding nakedType = null;
- boolean useDerivedTypesOfBound = bound instanceof TypeVariableBinding || bound instanceof ParameterizedTypeBinding;
+ boolean useDerivedTypesOfBound = bound instanceof TypeVariableBinding || (bound instanceof ParameterizedTypeBinding && !(bound instanceof RawTypeBinding)) ;
TypeBinding[] derivedTypes = getDerivedTypes(useDerivedTypesOfBound ? bound : genericType);
for (int i = 0, length = derivedTypes.length; i < length; i++) {
TypeBinding derivedType = derivedTypes[i];
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
index dbb4d49..cc1180e 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
@@ -387,7 +387,7 @@
}
TypeBinding unannotatedBound = bound == null ? null : getUnannotatedType(bound);
- boolean useDerivedTypesOfBound = unannotatedBound instanceof TypeVariableBinding || unannotatedBound instanceof ParameterizedTypeBinding;
+ boolean useDerivedTypesOfBound = unannotatedBound instanceof TypeVariableBinding || (unannotatedBound instanceof ParameterizedTypeBinding && !(unannotatedBound instanceof RawTypeBinding));
TypeBinding[] derivedTypes = this.types[useDerivedTypesOfBound ? unannotatedBound.id :unannotatedGenericType.id]; // by construction, cachedInfo != null now.
int i, length = derivedTypes.length;