# HG changeset patch # User pgovereau # Date 1397061687 -3600 # Node ID a53aa842f5cff7cde1de0d931d0ae1330bcd3710 # Parent 4bbbcaad653fa8d7aa2daf8b6042b70f8fea4178 8015499: javac, Gen is generating extra checkcast instructions in some corner cases Reviewed-by: vromero, jjg diff -r 4bbbcaad653f -r a53aa842f5cf langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Tue Apr 08 23:33:50 2014 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Wed Apr 09 17:41:27 2014 +0100 @@ -748,7 +748,7 @@ tree.clazz = translate(tree.clazz, null); Type originalTarget = tree.type; tree.type = erasure(tree.type); - tree.expr = translate(tree.expr, tree.type); + tree.expr = translate(tree.expr, erasure(tree.expr.type)); if (originalTarget.isCompound()) { Type.IntersectionClassType ict = (Type.IntersectionClassType)originalTarget; for (Type c : ict.getExplicitComponents()) { diff -r 4bbbcaad653f -r a53aa842f5cf langtools/test/tools/javac/T7053059/DoubleCastTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T7053059/DoubleCastTest.java Wed Apr 09 17:41:27 2014 +0100 @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2014, 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 8015499 + * @summary javac, Gen is generating extra checkcast instructions in some corner cases + * @run main DoubleCastTest + */ + +import java.util.List; +import java.util.ArrayList; +import com.sun.tools.classfile.*; +import com.sun.tools.javac.util.Assert; + +public class DoubleCastTest { + class C { + Object x; + Object m() { return null; } + void m1(byte[] b) {} + void m2() { + Object o; + Object[] os = null; + m1((byte[])(o = null)); + m1((byte[])o); + m1((byte[])(o == null ? o : o)); + m1((byte[])m()); + m1((byte[])os[0]); + m1((byte[])this.x); + } + } + + public static void main(String... cmdline) throws Exception { + + ClassFile cls = ClassFile.read(DoubleCastTest.class.getResourceAsStream("DoubleCastTest$C.class")); + for (Method m: cls.methods) + check(m); + } + + static void check(Method m) throws Exception { + boolean last_is_cast = false; + int last_ref = 0; + Code_attribute ea = (Code_attribute)m.attributes.get(Attribute.Code); + for (Instruction i : ea.getInstructions()) { + if (i.getOpcode() == Opcode.CHECKCAST) { + Assert.check + (!(last_is_cast && last_ref == i.getUnsignedShort(1)), + "Double cast found - Test failed"); + last_is_cast = true; + last_ref = i.getUnsignedShort(1); + } else { + last_is_cast = false; + } + } + } +}