From 3083c0197855a49e3a59ac3e677e69db0e5db4bc Mon Sep 17 00:00:00 2001 Date: Fri, 22 Jan 2021 11:33:03 +0800 Subject: Backpot of JDK-8214345 Summary: infinite recursion while checking super class LLT: langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.java Bug url: https://bugs.openjdk.java.net/browse/JDK-8214345 --- .../classes/com/sun/tools/javac/comp/Check.java | 7 +++++++ .../javac/generics/ClassBoundCheckingOverflow.java | 12 ++++++++++++ .../javac/generics/ClassBoundCheckingOverflow.out | 3 +++ 3 files changed, 22 insertions(+) create mode 100644 langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.java create mode 100644 langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.out diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java index d5e9c47a4..68af43821 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java @@ -2617,6 +2617,10 @@ public class Check { if (type.isErroneous()) return; for (List l = types.interfaces(type); l.nonEmpty(); l = l.tail) { Type it = l.head; + if (type.hasTag(CLASS) && !it.hasTag(CLASS)) { + continue; + } // JLS 8.1.5 + Type oldit = seensofar.put(it.tsym, it); if (oldit != null) { List oldparams = oldit.allparams(); @@ -2629,6 +2633,9 @@ public class Check { checkClassBounds(pos, seensofar, it); } Type st = types.supertype(type); + if (type.hasTag(CLASS) && !st.hasTag(CLASS)) { + return; + } // JLS 8.1.4 if (st != Type.noType) checkClassBounds(pos, seensofar, st); } diff --git a/langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.java b/langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.java new file mode 100644 index 000000000..1aeb7d71a --- /dev/null +++ b/langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.java @@ -0,0 +1,12 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8214345 + * @summary infinite recursion while checking super class + * + * @compile/fail/ref=ClassBoundCheckingOverflow.out -XDrawDiagnostics ClassBoundCheckingOverflow.java + */ + +public class ClassBoundCheckingOverflow { + abstract class InfiniteLoop1> extends E {} + abstract class InfiniteLoop2> implements E {} +} diff --git a/langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.out b/langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.out new file mode 100644 index 000000000..bed6acfd7 --- /dev/null +++ b/langtools/test/tools/javac/generics/ClassBoundCheckingOverflow.out @@ -0,0 +1,3 @@ +ClassBoundCheckingOverflow.java:10:70: compiler.err.type.found.req: (compiler.misc.type.parameter: E), (compiler.misc.type.req.class) +ClassBoundCheckingOverflow.java:11:73: compiler.err.type.found.req: (compiler.misc.type.parameter: E), (compiler.misc.type.req.class) +2 errors -- 2.19.0