1 /*
  2  * Copyright (c) 2024, 2026, 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 jdk.incubator.code.Reflect;
 25 
 26 import java.io.Serializable;
 27 import java.util.Collection;
 28 import java.util.List;
 29 
 30 /*
 31  * @test
 32  * @summary Smoke test for code reflection with cast expressions.
 33  * @modules jdk.incubator.code
 34  * @build CastInstanceOfTest
 35  * @build CodeReflectionTester
 36  * @run main CodeReflectionTester CastInstanceOfTest
 37  */
 38 
 39 public class CastInstanceOfTest {
 40 
 41     @Reflect
 42     @IR("""
 43             func @"test1" (%0 : java.type:"CastInstanceOfTest", %1 : java.type:"java.lang.Object")java.type:"void" -> {
 44                 %2 : Var<java.type:"java.lang.Object"> = var %1 @"o";
 45                 %3 : java.type:"java.lang.Object" = var.load %2;
 46                 %4 : java.type:"java.lang.String" = cast %3 @java.type:"java.lang.String";
 47                 %5 : Var<java.type:"java.lang.String"> = var %4 @"s";
 48                 %6 : java.type:"java.lang.String" = var.load %5;
 49                 %7 : Var<java.type:"java.lang.String"> = var %6 @"ss";
 50                 return;
 51             };
 52             """)
 53     void test1(Object o) {
 54         String s = (String) o;
 55         String ss = (String) s;
 56     }
 57 
 58     @Reflect
 59     @IR("""
 60             func @"test2" (%0 : java.type:"CastInstanceOfTest", %1 : java.type:"java.lang.Object")java.type:"void" -> {
 61                 %2 : Var<java.type:"java.lang.Object"> = var %1 @"o";
 62                 %3 : java.type:"java.lang.Object" = var.load %2;
 63                 %4 : java.type:"java.util.List<java.lang.String>" = cast %3 @java.type:"java.util.List";
 64                 %5 : Var<java.type:"java.util.List<java.lang.String>"> = var %4 @"l";
 65                 %6 : java.type:"java.util.List<java.lang.String>" = var.load %5;
 66                 %7 : Var<java.type:"java.util.Collection<java.lang.String>"> = var %6 @"c1";
 67                 %8 : java.type:"java.util.List<java.lang.String>" = var.load %5;
 68                 %9 : Var<java.type:"java.util.Collection<java.lang.String>"> = var %8 @"c2";
 69                 return;
 70             };
 71             """)
 72     void test2(Object o) {
 73         List<String> l = (List<String>) o;
 74         Collection<String> c1 = (List<String>) l;
 75         Collection<String> c2 = (Collection) l;
 76     }
 77 
 78     @Reflect
 79     @IR("""
 80             func @"test3" (%0 : java.type:"CastInstanceOfTest", %1 : java.type:"java.util.List<java.lang.String>")java.type:"void" -> {
 81                 %2 : Var<java.type:"java.util.List<java.lang.String>"> = var %1 @"l";
 82                 %3 : java.type:"java.util.List<java.lang.String>" = var.load %2;
 83                 %4 : Var<java.type:"java.util.List"> = var %3 @"raw";
 84                 %5 : java.type:"java.util.List" = var.load %4;
 85                 %6 : Var<java.type:"java.util.List<java.lang.Number>"> = var %5 @"ln";
 86                 return;
 87             };
 88             """)
 89     void test3(List<String> l) {
 90         List raw = l;
 91         List<Number> ln = raw;
 92     }
 93 
 94     @Reflect
 95     @IR("""
 96             func @"test4" (%0 : java.type:"CastInstanceOfTest", %1 : java.type:"int")java.type:"void" -> {
 97                 %2 : Var<java.type:"int"> = var %1 @"i";
 98                 %3 : java.type:"int" = var.load %2;
 99                 %4 : java.type:"long" = conv %3;
100                 %5 : Var<java.type:"long"> = var %4 @"l";
101                 return;
102             };
103             """)
104     void test4(int i) {
105         long l = (int) i;
106     }
107 
108     @Reflect
109     @IR("""
110             func @"test5" (%0 : java.type:"CastInstanceOfTest", %1 : java.type:"java.lang.Object")java.type:"void" -> {
111                 %2 : Var<java.type:"java.lang.Object"> = var %1 @"o";
112                 %3 : java.type:"java.lang.Object" = var.load %2;
113                 %4 : java.type:"boolean" = instanceof %3 @java.type:"java.lang.String";
114                 %5 : Var<java.type:"boolean"> = var %4 @"b";
115                 return;
116             };
117             """)
118     void test5(Object o) {
119         boolean b = o instanceof String;
120     }
121 
122     @Reflect
123     @IR("""
124             func @"test6" (%0 : java.type:"CastInstanceOfTest", %1 : java.type:"java.util.List<java.lang.Object>")java.type:"void" -> {
125                 %2 : Var<java.type:"java.util.List<java.lang.Object>"> = var %1 @"l";
126                 %3 : java.type:"java.util.List<java.lang.Object>" = var.load %2;
127                 %4 : java.type:"int" = constant @0;
128                 %5 : java.type:"java.lang.Object" = invoke %3 %4 @java.ref:"java.util.List::get(int):java.lang.Object";
129                 %6 : java.type:"boolean" = instanceof %5 @java.type:"java.lang.String";
130                 %7 : Var<java.type:"boolean"> = var %6 @"b";
131                 return;
132             };
133             """)
134     void test6(List<Object> l) {
135         boolean b = l.get(0) instanceof String;
136     }
137 
138     @Reflect
139     @IR("""
140             func @"test7" (%0 : java.type:"CastInstanceOfTest", %1 : java.type:"java.lang.Object")java.type:"void" -> {
141                 %2 : Var<java.type:"java.lang.Object"> = var %1 @"o";
142                 %3 : java.type:"java.lang.Object" = var.load %2;
143                 %4 : java.type:"boolean" = instanceof %3 @java.type:"java.lang.String";
144                 %5 : Var<java.type:"boolean"> = var %4 @"b";
145                 return;
146             };
147             """)
148     void test7(Object o) {
149         boolean b = o instanceof java.lang.String;
150     }
151 
152     @Reflect
153     @IR("""
154             func @"test8" (%0 : java.type:"CastInstanceOfTest", %1 : java.type:"java.lang.Object")java.type:"void" -> {
155                 %2 : Var<java.type:"java.lang.Object"> = var %1 @"o";
156                 %3 : java.type:"java.lang.Object" = var.load %2;
157                 %4 : java.type:"java.lang.Runnable" = cast %3 @java.type:"java.lang.Runnable";
158                 %5 : java.type:"java.io.Serializable" = cast %4 @java.type:"java.io.Serializable";
159                 %6 : java.type:"java.lang.Number" = cast %5 @java.type:"java.lang.Number";
160                 %7 : Var<java.type:"java.lang.Object"> = var %6 @"o2";
161                 return;
162             };
163             """)
164     void test8(Object o) {
165         Object o2 = (Number & Runnable & Serializable)o;
166     }
167 }