hotspot/test/compiler/c2/Test6832293.java
changeset 40059 c2304140ed64
parent 27699 9913b19c0948
child 41705 332239c052cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/c2/Test6832293.java	Tue Jul 12 18:24:48 2016 +0300
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2008, 2009, 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 6832293
+ * @summary JIT compiler got wrong result in type checking with -server
+ *
+ * @run main/othervm -Xcomp
+ *      -XX:CompileCommand=compileonly,compiler.c2.Test6832293::run
+ *      compiler.c2.Test6832293
+ */
+
+package compiler.c2;
+
+import java.io.PrintStream;
+
+public class Test6832293 {
+    static interface SomeInterface {
+        int SEVENS = 777;
+    }
+
+    static interface AnotherInterface {
+        int THIRDS = 33;
+    }
+
+    static class SomeClass implements SomeInterface {
+        int i;
+
+        SomeClass(int i) {
+            this.i = i;
+        }
+    }
+
+    static class ImmediateSubclass extends SomeClass implements SomeInterface {
+        float f;
+
+        ImmediateSubclass(int i, float f) {
+            super(i);
+            this.f = f;
+        }
+    }
+
+    static final class FinalSubclass extends ImmediateSubclass implements AnotherInterface {
+        double d;
+
+        FinalSubclass(int i, float f, double d) {
+            super(i, f);
+            this.d = d;
+        }
+    }
+
+    public static void main(String args[]) throws Exception{
+        /* try to pre initialize */
+        SomeClass[] a=new SomeClass[10];
+        String className = Test6832293.class.getName();
+        Class.forName(className + "$ImmediateSubclass");
+        Class.forName(className + "$FinalSubclass");
+        System.exit(run(args, System.out) + 95/*STATUS_TEMP*/);
+    }
+
+    static int errorStatus = 0/*STATUS_PASSED*/;
+
+    static void errorAlert(PrintStream out, int errorLevel) {
+        out.println("Test: failure #" + errorLevel);
+        errorStatus = 2/*STATUS_FAILED*/;
+    }
+
+    static SomeClass[] v2 = new FinalSubclass[4];
+
+    public static int run(String args[],PrintStream out) {
+        int i [], j [];
+        SomeInterface u [], v[] [];
+        AnotherInterface w [];
+        SomeClass x [] [];
+
+        i = new int [10];
+        i[0] = 777;
+        j = (int []) i;
+        if (j != i)
+            errorAlert(out, 2);
+        else if (j.length != 10)
+            errorAlert(out, 3);
+        else if (j[0] != 777)
+            errorAlert(out, 4);
+
+        v = new SomeClass [3] [];
+        x = (SomeClass [] []) v;
+        if (! (x instanceof SomeInterface [] []))
+            errorAlert(out, 5);
+        else if (! (x instanceof SomeClass [] []))
+            errorAlert(out, 6);
+        else if (x != v)
+            errorAlert(out, 7);
+
+        x[0] = (SomeClass []) new ImmediateSubclass [4];
+        if (! (x[0] instanceof ImmediateSubclass []))
+            errorAlert(out, 8);
+        else if (x[0].length != 4)
+            errorAlert(out, 9);
+
+        x[1] = (SomeClass []) v2;
+        if (! (x[1] instanceof FinalSubclass []))
+            errorAlert(out, 10);
+        else if (x[1].length != 4)
+            errorAlert(out, 11);
+
+        w = (AnotherInterface []) x[1];
+        if (! (w instanceof FinalSubclass []))
+            errorAlert(out, 12);
+        else if (w != x[1])
+            errorAlert(out, 13);
+        else if (w.length != 4)
+            errorAlert(out, 14);
+
+        return errorStatus;
+    }
+}
+