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 }