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);
 }