T8058199.java revision 2667:103d3df93bbd
1/* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26/** 27 * @test 28 * @bug 8058199 29 * @summary Code generation problem with javac skipping a checkcast instruction 30 */ 31public class T8058199 { 32 33 final static String SYNTHETIC_CAST_TYPE = "[Ljava.lang.String;"; 34 35 @SuppressWarnings("unchecked") 36 <Z> Z[] makeArr(Z z) { return (Z[])new Object[1]; } 37 38 <U> void check(U u) { } 39 40 void testMethod() { 41 test(() -> check(makeArr(""))); 42 } 43 44 void testNewDiamond() { 45 class Check<X> { 46 Check(X x) { } 47 } 48 test(()-> new Check<>(makeArr(""))); 49 } 50 51 void testNewGeneric() { 52 class Check { 53 <Z> Check(Z z) { } 54 } 55 test(()-> new Check(makeArr(""))); 56 } 57 58 private void test(Runnable r) { 59 try { 60 r.run(); 61 throw new AssertionError("Missing synthetic cast"); 62 } catch (ClassCastException cce) { 63 if (!cce.getMessage().contains(SYNTHETIC_CAST_TYPE)) { 64 throw new AssertionError("Bad type in synthetic cast", cce); 65 } 66 } 67 } 68 69 public static void main(String[] args) { 70 T8058199 test = new T8058199(); 71 test.testMethod(); 72 test.testNewDiamond(); 73 test.testNewGeneric(); 74 } 75} 76