diff options
| author | Stephan Herrmann | 2017-10-31 11:42:09 +0000 |
|---|---|---|
| committer | Stephan Herrmann | 2017-11-25 20:30:49 +0000 |
| commit | a2ee843b668ecf9aca7c99300671ad9c2845690b (patch) | |
| tree | 12a96a00d28e037f62ef8a804414aaf442677bfc | |
| parent | a7c7607635deb02672f2c1cb4ea8c2cdbe0585cc (diff) | |
| download | eclipse.jdt.core-a2ee843b668ecf9aca7c99300671ad9c2845690b.tar.gz eclipse.jdt.core-a2ee843b668ecf9aca7c99300671ad9c2845690b.tar.xz eclipse.jdt.core-a2ee843b668ecf9aca7c99300671ad9c2845690b.zip | |
Bug 527731 - Incorrect cycle detected in type hierarchyI20171126-2000
Change-Id: Iaffd5edb895215a70ed523ef29336f0c4ec2ee8b
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 { |
