1 /*
  2  * Copyright (c) 2024, 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.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 import java.lang.runtime.CodeReflection;
 25 import java.util.Collection;
 26 import java.util.List;
 27 
 28 /*
 29  * @test
 30  * @summary Smoke test for code reflection with cast expressions.
 31  * @build CastInstanceOfTest
 32  * @build CodeReflectionTester
 33  * @run main CodeReflectionTester CastInstanceOfTest
 34  */
 35 
 36 public class CastInstanceOfTest {
 37 
 38     @CodeReflection
 39     @IR("""
 40             func @"test1" (%0 : CastInstanceOfTest, %1 : java.lang.Object)void -> {
 41                 %2 : Var<java.lang.Object> = var %1 @"o";
 42                 %3 : java.lang.Object = var.load %2;
 43                 %4 : java.lang.String = cast %3 @"java.lang.String";
 44                 %5 : Var<java.lang.String> = var %4 @"s";
 45                 %6 : java.lang.String = var.load %5;
 46                 %7 : Var<java.lang.String> = var %6 @"ss";
 47                 return;
 48             };
 49             """)
 50     void test1(Object o) {
 51         String s = (String) o;
 52         String ss = (String) s;
 53     }
 54 
 55     @CodeReflection
 56     @IR("""
 57             func @"test2" (%0 : CastInstanceOfTest, %1 : java.lang.Object)void -> {
 58                 %2 : Var<java.lang.Object> = var %1 @"o";
 59                 %3 : java.lang.Object = var.load %2;
 60                 %4 : java.util.List<java.lang.String> = cast %3 @"java.util.List";
 61                 %5 : Var<java.util.List<java.lang.String>> = var %4 @"l";
 62                 %6 : java.util.List<java.lang.String> = var.load %5;
 63                 %7 : Var<java.util.Collection<java.lang.String>> = var %6 @"c1";
 64                 %8 : java.util.List<java.lang.String> = var.load %5;
 65                 %9 : Var<java.util.Collection<java.lang.String>> = var %8 @"c2";
 66                 return;
 67             };
 68             """)
 69     void test2(Object o) {
 70         List<String> l = (List<String>) o;
 71         Collection<String> c1 = (List<String>) l;
 72         Collection<String> c2 = (Collection) l;
 73     }
 74 
 75     @CodeReflection
 76     @IR("""
 77             func @"test3" (%0 : CastInstanceOfTest, %1 : java.util.List<java.lang.String>)void -> {
 78                 %2 : Var<java.util.List<java.lang.String>> = var %1 @"l";
 79                 %3 : java.util.List<java.lang.String> = var.load %2;
 80                 %4 : Var<java.util.List> = var %3 @"raw";
 81                 %5 : java.util.List = var.load %4;
 82                 %6 : Var<java.util.List<java.lang.Number>> = var %5 @"ln";
 83                 return;
 84             };
 85             """)
 86     void test3(List<String> l) {
 87         List raw = l;
 88         List<Number> ln = raw;
 89     }
 90 
 91     @CodeReflection
 92     @IR("""
 93             func @"test4" (%0 : CastInstanceOfTest, %1 : int)void -> {
 94                 %2 : Var<int> = var %1 @"i";
 95                 %3 : int = var.load %2;
 96                 %4 : long = conv %3;
 97                 %5 : Var<long> = var %4 @"l";
 98                 return;
 99             };
100             """)
101     void test4(int i) {
102         long l = (int) i;
103     }
104 
105     @CodeReflection
106     @IR("""
107             func @"test5" (%0 : CastInstanceOfTest, %1 : java.lang.Object)void -> {
108                 %2 : Var<java.lang.Object> = var %1 @"o";
109                 %3 : java.lang.Object = var.load %2;
110                 %4 : boolean = instanceof %3 @"java.lang.String";
111                 %5 : Var<boolean> = var %4 @"b";
112                 return;
113             };
114             """)
115     void test5(Object o) {
116         boolean b = o instanceof String;
117     }
118 
119     @CodeReflection
120     @IR("""
121             func @"test6" (%0 : CastInstanceOfTest, %1 : java.util.List<java.lang.Object>)void -> {
122                 %2 : Var<java.util.List<java.lang.Object>> = var %1 @"l";
123                 %3 : java.util.List<java.lang.Object> = var.load %2;
124                 %4 : int = constant @"0";
125                 %5 : java.lang.Object = invoke %3 %4 @"java.util.List::get(int)java.lang.Object";
126                 %6 : boolean = instanceof %5 @"java.lang.String";
127                 %7 : Var<boolean> = var %6 @"b";
128                 return;
129             };
130             """)
131     void test6(List<Object> l) {
132         boolean b = l.get(0) instanceof String;
133     }
134 }