Mercurial > hg > openjdk > jdk8u > langtools
changeset 3924:6e44be19a4f8
8214345: infinite recursion while checking super class
Reviewed-by: vromero
author | bsrbnd |
---|---|
date | Thu, 11 Mar 2021 11:04:31 +0800 |
parents | 21738367961e |
children | 2dfc2246f52d 64aff9f20736 |
files | src/share/classes/com/sun/tools/javac/comp/Check.java test/tools/javac/generics/ClassBoundCheckingOverflow.java test/tools/javac/generics/ClassBoundCheckingOverflow.out |
diffstat | 3 files changed, 19 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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<Type> 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<Type> 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); }
--- /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<E extends InfiniteLoop1<E>> extends E {} + abstract class InfiniteLoop2<E extends InfiniteLoop2<E>> implements E {} +}
--- /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