Fixed bug 479802 - "VerifyError: Bad type on operand stack" due to extra
checkcast
Change-Id: I4777491e91b770997f360b182923d68ec4ce5164
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
index 22b1ba7..c9b59ee 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
@@ -7550,4 +7550,44 @@
"}\n"
});
}
+ public void testBug479802() {
+ runConformTest(
+ new String[] {
+ "CompilerBugUncheckedCast.java",
+ "public class CompilerBugUncheckedCast {\n" +
+ " public static void main(String[] args) {\n" +
+ " Create(true);\n" +
+ " Create(false);\n" +
+ " }\n" +
+ " public interface Base {\n" +
+ " default String def() { return \"Base\"; }\n" +
+ " }\n" +
+ " public interface Intermediate extends Base {\n" +
+ " @Override default String def() { return \"Intermediate\"; }\n" +
+ " }\n" +
+ " public interface Derived extends Intermediate { }\n" +
+ " public static class MyObject implements Base { }\n" +
+ " public static final class OldObject extends MyObject implements Derived { }\n" +
+ " public static final class NewObject extends MyObject implements Derived { }\n" +
+ " public static <OBJECT extends MyObject & Derived> void Make(OBJECT o) { }\n" +
+ " public static MyObject Create(boolean old) {\n" +
+ " MyObject f;\n" +
+ " if (old) {\n" +
+ " f = new OldObject();\n" +
+ " } else {\n" +
+ " f = new NewObject();\n" +
+ " }\n" +
+ " Make(uncheckedCast(f));\n" +
+ " System.out.println(old);\n" +
+ " return f;\n" +
+ " }\n" +
+ " @SuppressWarnings(\"unchecked\")\n" +
+ " private static <T extends MyObject & Derived> T uncheckedCast(MyObject f) {\n" +
+ " return (T) f;\n" +
+ " }\n" +
+ "}"
+ },
+ "true\n" +
+ "false");
+ }
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
index ed3be31..f2d8789 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
@@ -37,6 +37,8 @@
package org.eclipse.jdt.internal.compiler.lookup;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -681,6 +683,15 @@
}
public TypeBinding createIntersectionType18(ReferenceBinding[] intersectingTypes) {
+ if (!intersectingTypes[0].isClass()) {
+ Arrays.sort(intersectingTypes, new Comparator<TypeBinding>() {
+ @Override
+ public int compare(TypeBinding o1, TypeBinding o2) {
+ //
+ return o1.isClass() ? -1 : (o2.isClass() ? 1 : 0);
+ }
+ });
+ }
return this.typeSystem.getIntersectionType18(intersectingTypes);
}