Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Herrmann2017-10-31 11:42:09 +0000
committerStephan Herrmann2018-02-03 19:08:55 +0000
commitb1c2a63442229d51e669de6df7b1c9d0e7e3af64 (patch)
tree5e3dbdbf1f9db0bd639dd8555f138d2044e6ce69
parent6b020e705ba2669481bde653aefe4e4b18b04efe (diff)
downloadeclipse.jdt.core-b1c2a63442229d51e669de6df7b1c9d0e7e3af64.tar.gz
eclipse.jdt.core-b1c2a63442229d51e669de6df7b1c9d0e7e3af64.tar.xz
eclipse.jdt.core-b1c2a63442229d51e669de6df7b1c9d0e7e3af64.zip
Bug 527731 - Incorrect cycle detected in type hierarchy
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerClass15Test.java48
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java2
2 files changed, 49 insertions, 1 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerClass15Test.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerClass15Test.java
index da87c14a37..c1d45d1132 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerClass15Test.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerClass15Test.java
@@ -708,6 +708,54 @@ public void testBug520874i() {
"Cycle detected: a cycle exists in the type hierarchy between A and C\n" +
"----------\n");
}
+public void testBug526681() {
+ runNegativeTest(
+ new String[] {
+ "p/A.java",
+ "package p;\n" +
+ "import p.B;\n" +
+ "public class A extends B {\n" +
+ " public static abstract class C {}\n" +
+ "}\n",
+ "p/B.java",
+ "package p;\n" +
+ "import p.A.C;\n" +
+ "public abstract class B extends C {}"
+ },
+ "----------\n" +
+ "1. ERROR in p\\A.java (at line 3)\n" +
+ " public class A extends B {\n" +
+ " ^\n" +
+ "The hierarchy of the type A is inconsistent\n" +
+ "----------\n" +
+ "----------\n" +
+ "1. ERROR in p\\B.java (at line 3)\n" +
+ " public abstract class B extends C {}\n" +
+ " ^\n" +
+ "Cycle detected: a cycle exists in the type hierarchy between B and A\n" +
+ "----------\n");
+}
+public void testBug527731() {
+ if (this.complianceLevel < ClassFileConstants.JDK1_8) return; // uses diamond, 1.7-inference fails, only 1.8 is good
+ runConformTest(
+ new String[] {
+ "OuterClass.java",
+ "import java.util.ArrayList;\n" +
+ "\n" +
+ "public class OuterClass<T> extends ArrayList<OuterClass.InnerTypedClass<T>> {\n" +
+ " \n" +
+ " public static interface InnerInterface {}\n" +
+ " \n" +
+ " public static class InnerTypedClass<T> implements InnerInterface {}\n" +
+ " \n" +
+ " public static void main(String[] args) {\n" +
+ " OuterClass<String> outerClass = new OuterClass<>();\n" +
+ " outerClass.add(new InnerTypedClass<>());\n" +
+ " System.out.println(outerClass);\n" +
+ " }\n" +
+ "}\n"
+ });
+}
public static Class<InnerClass15Test> testClass() {
return InnerClass15Test.class;
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java
index 2fe855d74d..752a12705b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java
@@ -606,8 +606,8 @@ public TypeBinding resolveTypeArgument(ClassScope classScope, ReferenceBinding g
boolean pauseHierarchyCheck = false;
try {
if (ref.isHierarchyBeingConnected()) {
+ pauseHierarchyCheck = (ref.tagBits & TagBits.PauseHierarchyCheck) == 0;
ref.tagBits |= TagBits.PauseHierarchyCheck;
- pauseHierarchyCheck = true;
}
return resolveType(classScope, Binding.DefaultLocationTypeArgument);
} finally {

Back to the top