Fixed Bug 445669 - java.lang.IllegalStateException at
org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding.clone
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
index 5258ab4..057cb7d 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
@@ -5886,4 +5886,48 @@
"Contradictory null annotations: method was inferred as \'int compare(@NonNull @Nullable Integer, @NonNull @Nullable Integer)\', but only one of \'@NonNull\' and \'@Nullable\' can be effective at any location\n" +
"----------\n");
}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=445669, java.lang.IllegalStateException at org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding.clone
+public void test445669() {
+ Map options = getCompilerOptions();
+ runConformTestWithLibs(
+ new String[] {
+ "Y.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "@NonNullByDefault(DefaultLocation.FIELD)\n" +
+ "public class Y {\n" +
+ " public Z.ZI zzi = new Z().new ZI();\n" +
+ " public Z z = new Z();\n" +
+ "}\n",
+ "Z.java",
+ "public class Z {\n" +
+ " public class ZI {\n" +
+ " }\n" +
+ "}\n"
+ },
+ options,
+ "");
+ runNegativeTestWithLibs(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void main(String[] args) {\n" +
+ " Y y = new Y();\n" +
+ " y.zzi = null;\n" +
+ " y.z = null;\n" +
+ " }\n" +
+ "}\n"
+ },
+ options,
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " y.zzi = null;\n" +
+ " ^^^^\n" +
+ "Null type mismatch: required \'Z.@NonNull ZI\' but the provided value is null\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 5)\n" +
+ " y.z = null;\n" +
+ " ^^^^\n" +
+ "Null type mismatch: required \'@NonNull Z\' but the provided value is null\n" +
+ "----------\n");
+}
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
index 163b799..ce4f3d8 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
@@ -39,8 +39,8 @@
}
public TypeBinding clone(TypeBinding outerType) {
- if (this.resolvedType != null || this.depth() > 0)
- throw new IllegalStateException();
+ if (this.resolvedType != null)
+ return this.resolvedType.clone(outerType);
UnresolvedReferenceBinding copy = new UnresolvedReferenceBinding(this);
this.addWrapper(copy, null);
return copy;