Bug 338350: COMPILER_PB_UNAVOIDABLE_GENERIC_TYPE_PROBLEMS wrongly suppresses "Unchecked cast"
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 bf4bacd..dd8c568 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
@@ -1202,6 +1202,169 @@
"Zork cannot be resolved to a type\n" +
"----------\n");
}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=338350 (unchecked cast - only unavoidable on raw expression)
+public void test338350() {
+ String[] testFiles = new String[] {
+ "Try.java",
+ "import java.lang.reflect.Array;\n" +
+ "import java.util.ArrayList;\n" +
+ "import java.util.List;\n" +
+ "public class Try<E> {\n" +
+ " void fooObj() {\n" +
+ " takeObj((E) Bar.getObject());\n" +
+ " takeObj((E) Bar.getArray());\n" +
+ " takeObj((E) Array.newInstance(Integer.class, 2));\n" +
+ " }\n" +
+ " void takeObj(E obj) { }\n" +
+ " void fooArray() {\n" +
+ " takeArray((E[]) Bar.getArray());\n" +
+ " takeArray((E[]) Array.newInstance(Integer.class, 2));\n" +
+ " }\n" +
+ " void takeArray(E[] array) { }\n" +
+ " <L> void foo(List<L> list) {\n" +
+ " list.toArray((L[]) Bar.getArray());\n" +
+ " list.toArray((L[]) Array.newInstance(Integer.class, 2));\n" +
+ " }\n" +
+ " void bar() {\n" +
+ " List<String> l = Bar.getRawList();\n" +
+ " ArrayList<String> l2 = (ArrayList<String>) Bar.getRawList();\n" +
+ " }\n" +
+ "}\n",
+ "Bar.java",
+ "import java.lang.reflect.Array;\n" +
+ "import java.util.ArrayList;\n" +
+ "import java.util.List;\n" +
+ "public class Bar {\n" +
+ " public static Object getObject() {\n" +
+ " return new Object();\n" +
+ " }\n" +
+ " public static Object[] getArray() {\n" +
+ " return (Object[]) Array.newInstance(Integer.class, 2);\n" +
+ " }\n" +
+ " public static List getRawList() {\n" +
+ " return new ArrayList();\n" +
+ " }\n" +
+ "}\n"
+ };
+ Map customOptions = getCompilerOptions();
+ customOptions.put(CompilerOptions.OPTION_ReportUnavoidableGenericTypeProblems, CompilerOptions.ENABLED);
+ this.runNegativeTest(
+ testFiles,
+ "----------\n" +
+ "1. WARNING in Try.java (at line 6)\n" +
+ " takeObj((E) Bar.getObject());\n" +
+ " ^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object to E\n" +
+ "----------\n" +
+ "2. WARNING in Try.java (at line 7)\n" +
+ " takeObj((E) Bar.getArray());\n" +
+ " ^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object[] to E\n" +
+ "----------\n" +
+ "3. WARNING in Try.java (at line 8)\n" +
+ " takeObj((E) Array.newInstance(Integer.class, 2));\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object to E\n" +
+ "----------\n" +
+ "4. WARNING in Try.java (at line 12)\n" +
+ " takeArray((E[]) Bar.getArray());\n" +
+ " ^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object[] to E[]\n" +
+ "----------\n" +
+ "5. WARNING in Try.java (at line 13)\n" +
+ " takeArray((E[]) Array.newInstance(Integer.class, 2));\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object to E[]\n" +
+ "----------\n" +
+ "6. WARNING in Try.java (at line 17)\n" +
+ " list.toArray((L[]) Bar.getArray());\n" +
+ " ^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object[] to L[]\n" +
+ "----------\n" +
+ "7. WARNING in Try.java (at line 18)\n" +
+ " list.toArray((L[]) Array.newInstance(Integer.class, 2));\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object to L[]\n" +
+ "----------\n" +
+ "8. WARNING in Try.java (at line 21)\n" +
+ " List<String> l = Bar.getRawList();\n" +
+ " ^^^^^^^^^^^^^^^^\n" +
+ "Type safety: The expression of type List needs unchecked conversion to conform to List<String>\n" +
+ "----------\n" +
+ "9. WARNING in Try.java (at line 22)\n" +
+ " ArrayList<String> l2 = (ArrayList<String>) Bar.getRawList();\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from List to ArrayList<String>\n" +
+ "----------\n" +
+ "----------\n" +
+ "1. WARNING in Bar.java (at line 11)\n" +
+ " public static List getRawList() {\n" +
+ " ^^^^\n" +
+ "List is a raw type. References to generic type List<E> should be parameterized\n" +
+ "----------\n" +
+ "2. WARNING in Bar.java (at line 12)\n" +
+ " return new ArrayList();\n" +
+ " ^^^^^^^^^\n" +
+ "ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
+ "----------\n",
+ null,
+ true,
+ customOptions);
+ customOptions.put(CompilerOptions.OPTION_ReportUnavoidableGenericTypeProblems, CompilerOptions.DISABLED);
+ this.runNegativeTest(
+ testFiles,
+ "----------\n" +
+ "1. WARNING in Try.java (at line 6)\n" +
+ " takeObj((E) Bar.getObject());\n" +
+ " ^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object to E\n" +
+ "----------\n" +
+ "2. WARNING in Try.java (at line 7)\n" +
+ " takeObj((E) Bar.getArray());\n" +
+ " ^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object[] to E\n" +
+ "----------\n" +
+ "3. WARNING in Try.java (at line 8)\n" +
+ " takeObj((E) Array.newInstance(Integer.class, 2));\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object to E\n" +
+ "----------\n" +
+ "4. WARNING in Try.java (at line 12)\n" +
+ " takeArray((E[]) Bar.getArray());\n" +
+ " ^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object[] to E[]\n" +
+ "----------\n" +
+ "5. WARNING in Try.java (at line 13)\n" +
+ " takeArray((E[]) Array.newInstance(Integer.class, 2));\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object to E[]\n" +
+ "----------\n" +
+ "6. WARNING in Try.java (at line 17)\n" +
+ " list.toArray((L[]) Bar.getArray());\n" +
+ " ^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object[] to L[]\n" +
+ "----------\n" +
+ "7. WARNING in Try.java (at line 18)\n" +
+ " list.toArray((L[]) Array.newInstance(Integer.class, 2));\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked cast from Object to L[]\n" +
+ "----------\n" +
+ "----------\n" +
+ "1. WARNING in Bar.java (at line 11)\n" +
+ " public static List getRawList() {\n" +
+ " ^^^^\n" +
+ "List is a raw type. References to generic type List<E> should be parameterized\n" +
+ "----------\n" +
+ "2. WARNING in Bar.java (at line 12)\n" +
+ " return new ArrayList();\n" +
+ " ^^^^^^^^^\n" +
+ "ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
+ "----------\n",
+ null,
+ true,
+ customOptions);
+}
+
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=334622 (private access - same package)
public void test334622b() {
this.runNegativeTest(
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
index b8be769..5380b813 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
@@ -514,7 +514,8 @@
if (isLegal) {
this.expression.computeConversion(scope, castType, expressionType);
if ((this.bits & ASTNode.UnsafeCast) != 0) { // unsafe cast
- if (scope.compilerOptions().reportUnavoidableGenericTypeProblems || !this.expression.forcedToBeRaw(scope.referenceContext())) {
+ if (scope.compilerOptions().reportUnavoidableGenericTypeProblems
+ || !(expressionType.isRawType() && this.expression.forcedToBeRaw(scope.referenceContext()))) {
scope.problemReporter().unsafeCast(this, scope);
}
} else {