# HG changeset patch # User sadayapalam # Date 1511251032 -19800 # Node ID 924591048898b2458480a8b395f7b56cc3117a9e # Parent b29191b9e727481cf15d0ce042db2d5ee944bc5c 8189659: Anonymous subtype of raw type causes VerifyError Reviewed-by: mcimadamore diff -r b29191b9e727 -r 924591048898 src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java Mon Nov 20 20:49:56 2017 -0800 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java Tue Nov 21 13:27:12 2017 +0530 @@ -253,8 +253,7 @@ boolean hypothetical, ListBuffer bridges) { make.at(pos); - Type origType = types.memberType(origin.type, meth); - Type origErasure = erasure(origType); + Type implTypeErasure = erasure(impl.type); // Create a bridge method symbol and a bridge definition without a body. Type bridgeType = meth.erasure(types); @@ -281,7 +280,7 @@ : make.Super(types.supertype(origin.type).tsym.erasure(types), origin); // The type returned from the original method. - Type calltype = erasure(impl.type.getReturnType()); + Type calltype = implTypeErasure.getReturnType(); // Construct a call of this.impl(params), or super.impl(params), // casting params and possibly results as needed. @@ -289,9 +288,9 @@ make.Apply( null, make.Select(receiver, impl).setType(calltype), - translateArgs(make.Idents(md.params), origErasure.getParameterTypes(), null)) + translateArgs(make.Idents(md.params), implTypeErasure.getParameterTypes(), null)) .setType(calltype); - JCStatement stat = (origErasure.getReturnType().hasTag(VOID)) + JCStatement stat = (implTypeErasure.getReturnType().hasTag(VOID)) ? make.Exec(call) : make.Return(coerce(call, bridgeType.getReturnType())); md.body = make.Block(0, List.of(stat)); diff -r b29191b9e727 -r 924591048898 test/langtools/tools/javac/generics/bridges/AnonymousSubtypeOfRawSupertype.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/generics/bridges/AnonymousSubtypeOfRawSupertype.java Tue Nov 21 13:27:12 2017 +0530 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8189659 + * @summary Anonymous subtype of raw type causes VerifyError + * @run main AnonymousSubtypeOfRawSupertype + */ + +public class AnonymousSubtypeOfRawSupertype<_J extends AnonymousSubtypeOfRawSupertype> implements Comparable<_J> { + static { + System.err.println(System.getProperty("java.version")); + } + public static AnonymousSubtypeOfRawSupertype EMPTY = new AnonymousSubtypeOfRawSupertype() { + void something() { + System.out.println("This is something"); + } + }; + public AnonymousSubtypeOfRawSupertype() { + } + @Override + public int compareTo(_J o) { + return 0; + } + public static void main(String[] args) { + AnonymousSubtypeOfRawSupertype generic = AnonymousSubtypeOfRawSupertype.EMPTY; + } +} \ No newline at end of file diff -r b29191b9e727 -r 924591048898 test/langtools/tools/javac/generics/bridges/VerifyNoBridgeLoopTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/generics/bridges/VerifyNoBridgeLoopTest.java Tue Nov 21 13:27:12 2017 +0530 @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8189659 + * @summary Verify that the infinite loop of bridges from JDK-6996415 is not reintroduced + * @run main VerifyNoBridgeLoopTest + */ + +public class VerifyNoBridgeLoopTest { + static class Expression {} + abstract static class ExpVisitor { + static int f = 1; + protected R visitExpression (Expression exp, D d) { f *= 100; System.out.println(exp); return null; } + } + + abstract static class ExpExpVisitor extends ExpVisitor { } + + static class FindTail extends ExpExpVisitor { + protected Expression visitExpression (Expression exp, Expression returnContinuation) { + return super.visitExpression(exp, exp); + } + } + public static void main(String [] args) { + new FindTail().visitExpression(new Expression(), new Expression()); + ExpVisitor e = new FindTail(); + e.visitExpression(new Expression(), new Expression()); + if (e.f != 10000) + throw new AssertionError("Incorrect call sequence"); + } +}