diff options
| author | Stephan Herrmann | 2017-10-31 11:42:09 +0000 |
|---|---|---|
| committer | Stephan Herrmann | 2018-02-03 19:08:55 +0000 |
| commit | b1c2a63442229d51e669de6df7b1c9d0e7e3af64 (patch) | |
| tree | 5e3dbdbf1f9db0bd639dd8555f138d2044e6ce69 | |
| parent | 6b020e705ba2669481bde653aefe4e4b18b04efe (diff) | |
| download | eclipse.jdt.core-b1c2a63442229d51e669de6df7b1c9d0e7e3af64.tar.gz eclipse.jdt.core-b1c2a63442229d51e669de6df7b1c9d0e7e3af64.tar.xz eclipse.jdt.core-b1c2a63442229d51e669de6df7b1c9d0e7e3af64.zip | |
Bug 527731 - Incorrect cycle detected in type hierarchy
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 { |
