# HG changeset patch # User bsrbnd # Date 1615431871 -28800 # Node ID 6e44be19a4f85fc64996ad9da33be0538857cec2 # Parent 21738367961ed2263de0fc0b9eca36da78e51674 8214345: infinite recursion while checking super class Reviewed-by: vromero diff -r 21738367961e -r 6e44be19a4f8 src/share/classes/com/sun/tools/javac/comp/Check.java --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Mon Mar 01 20:02:57 2021 +0000 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Mar 11 11:04:31 2021 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2617,6 +2617,8 @@ 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 +2631,7 @@ 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 -r 21738367961e -r 6e44be19a4f8 test/tools/javac/generics/ClassBoundCheckingOverflow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/ClassBoundCheckingOverflow.java Thu Mar 11 11:04:31 2021 +0800 @@ -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 -r 21738367961e -r 6e44be19a4f8 test/tools/javac/generics/ClassBoundCheckingOverflow.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/ClassBoundCheckingOverflow.out Thu Mar 11 11:04:31 2021 +0800 @@ -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