1 /*
  2  * Copyright (c) 2019, 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 8222402
 29  * @summary LW2 array support in javac
 30  * @compile -XDenablePrimitiveClasses ArrayRelationsTest.java
 31  * @run main/othervm -XX:+EnableValhalla -XX:+EnablePrimitiveClasses ArrayRelationsTest
 32  */
 33 
 34 public primitive class ArrayRelationsTest {
 35 
 36     int x = 42;
 37 
 38     public static void main(String [] args) {
 39         ArrayRelationsTest.ref [] la = new ArrayRelationsTest.ref[10];
 40         ArrayRelationsTest [] qa = new ArrayRelationsTest[10];
 41         boolean cce = false;
 42         try {
 43             qa = (ArrayRelationsTest[]) (Object []) (new String [10]);
 44         } catch (ClassCastException e) {
 45             cce = true;
 46         }
 47         if (!cce) {
 48             throw new AssertionError("Missing CCE");
 49         }
 50         la = qa;
 51         ArrayRelationsTest.ref[] la2 = qa;
 52         ArrayRelationsTest [] qa2 = (ArrayRelationsTest []) la2;
 53         boolean npe = false;
 54         try {
 55             la2[0] = null;
 56         } catch (NullPointerException e) {
 57             npe = true;
 58         }
 59         if (!npe) {
 60             throw new AssertionError("Missing NPE");
 61         }
 62         npe = false;
 63         Object [] oa = qa;
 64         try {
 65             oa[0] = null;
 66         } catch (NullPointerException e) {
 67             npe = true;
 68         }
 69         if (!npe) {
 70             throw new AssertionError("Missing NPE");
 71         }
 72 
 73         // round trip;
 74         Object o = oa = la = qa;
 75         qa = (ArrayRelationsTest[]) (la = (ArrayRelationsTest.ref []) (oa = (Object []) o));
 76         qa [0] = new ArrayRelationsTest();
 77 
 78         npe = false;
 79         try {
 80             la[0] = null;
 81         } catch (NullPointerException e) {
 82             npe = true;
 83         }
 84         if (!npe) {
 85             throw new AssertionError("Missing NPE");
 86         }
 87 
 88         la = new ArrayRelationsTest.ref [10];
 89 
 90         cce = false;
 91         try {
 92             qa = (ArrayRelationsTest[]) la;
 93         } catch (ClassCastException c) {
 94             cce = true;
 95         }
 96         if (!cce) {
 97             throw new AssertionError("Unexpected CCE behavior");
 98         }
 99     }
100 }