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 /*
25 * @test
26 * @summary Smoke test for code reflection with primitive casts.
27 * @modules jdk.incubator.code
28 * @build PrimitiveCastTest
29 * @build CodeReflectionTester
30 * @run main CodeReflectionTester PrimitiveCastTest
31 */
32
33 import jdk.incubator.code.CodeReflection;
34
35 public class PrimitiveCastTest {
36
37 @CodeReflection
38 @IR("""
39 func @"testFromDouble" (%0 : java.type:"PrimitiveCastTest", %1 : java.type:"double")java.type:"void" -> {
40 %2 : Var<java.type:"double"> = var %1 @"v";
41 %3 : java.type:"double" = var.load %2;
42 %4 : Var<java.type:"double"> = var %3 @"d";
43 %5 : java.type:"double" = var.load %2;
44 %6 : java.type:"float" = conv %5;
45 %7 : Var<java.type:"float"> = var %6 @"f";
46 %8 : java.type:"double" = var.load %2;
47 %9 : java.type:"long" = conv %8;
48 %10 : Var<java.type:"long"> = var %9 @"l";
49 %11 : java.type:"double" = var.load %2;
50 %12 : java.type:"int" = conv %11;
51 %13 : Var<java.type:"int"> = var %12 @"i";
52 %14 : java.type:"double" = var.load %2;
53 %15 : java.type:"short" = conv %14;
54 %16 : Var<java.type:"short"> = var %15 @"s";
55 %17 : java.type:"double" = var.load %2;
56 %18 : java.type:"char" = conv %17;
57 %19 : Var<java.type:"char"> = var %18 @"c";
58 %20 : java.type:"double" = var.load %2;
59 %21 : java.type:"byte" = conv %20;
60 %22 : Var<java.type:"byte"> = var %21 @"b";
61 return;
62 };
63 """)
64 @SuppressWarnings("cast")
65 void testFromDouble(double v) {
66 double d = (double) v;
67 float f = (float) v;
68 long l = (long) v;
69 int i = (int) v;
70 short s = (short) v;
71 char c = (char) v;
72 byte b = (byte) v;
73 }
74
75 @CodeReflection
76 @IR("""
77 func @"testFromFloat" (%0 : java.type:"PrimitiveCastTest", %1 : java.type:"float")java.type:"void" -> {
78 %2 : Var<java.type:"float"> = var %1 @"v";
79 %3 : java.type:"float" = var.load %2;
80 %4 : java.type:"double" = conv %3;
81 %5 : Var<java.type:"double"> = var %4 @"d";
82 %6 : java.type:"float" = var.load %2;
83 %7 : Var<java.type:"float"> = var %6 @"f";
84 %8 : java.type:"float" = var.load %2;
85 %9 : java.type:"long" = conv %8;
86 %10 : Var<java.type:"long"> = var %9 @"l";
87 %11 : java.type:"float" = var.load %2;
88 %12 : java.type:"int" = conv %11;
89 %13 : Var<java.type:"int"> = var %12 @"i";
90 %14 : java.type:"float" = var.load %2;
91 %15 : java.type:"short" = conv %14;
92 %16 : Var<java.type:"short"> = var %15 @"s";
93 %17 : java.type:"float" = var.load %2;
94 %18 : java.type:"char" = conv %17;
95 %19 : Var<java.type:"char"> = var %18 @"c";
96 %20 : java.type:"float" = var.load %2;
97 %21 : java.type:"byte" = conv %20;
98 %22 : Var<java.type:"byte"> = var %21 @"b";
99 return;
100 };
101 """)
102 @SuppressWarnings("cast")
103 void testFromFloat(float v) {
104 double d = (double) v;
105 float f = (float) v;
106 long l = (long) v;
107 int i = (int) v;
108 short s = (short) v;
109 char c = (char) v;
110 byte b = (byte) v;
111 }
112
113 @CodeReflection
114 @IR("""
115 func @"testFromLong" (%0 : java.type:"PrimitiveCastTest", %1 : java.type:"long")java.type:"void" -> {
116 %2 : Var<java.type:"long"> = var %1 @"v";
117 %3 : java.type:"long" = var.load %2;
118 %4 : java.type:"double" = conv %3;
119 %5 : Var<java.type:"double"> = var %4 @"d";
120 %6 : java.type:"long" = var.load %2;
121 %7 : java.type:"float" = conv %6;
122 %8 : Var<java.type:"float"> = var %7 @"f";
123 %9 : java.type:"long" = var.load %2;
124 %10 : Var<java.type:"long"> = var %9 @"l";
125 %11 : java.type:"long" = var.load %2;
126 %12 : java.type:"int" = conv %11;
127 %13 : Var<java.type:"int"> = var %12 @"i";
128 %14 : java.type:"long" = var.load %2;
129 %15 : java.type:"short" = conv %14;
130 %16 : Var<java.type:"short"> = var %15 @"s";
131 %17 : java.type:"long" = var.load %2;
132 %18 : java.type:"char" = conv %17;
133 %19 : Var<java.type:"char"> = var %18 @"c";
134 %20 : java.type:"long" = var.load %2;
135 %21 : java.type:"byte" = conv %20;
136 %22 : Var<java.type:"byte"> = var %21 @"b";
137 return;
138 };
139 """)
140 @SuppressWarnings("cast")
141 void testFromLong(long v) {
142 double d = (double) v;
143 float f = (float) v;
144 long l = (long) v;
145 int i = (int) v;
146 short s = (short) v;
147 char c = (char) v;
148 byte b = (byte) v;
149 }
150
151 @CodeReflection
152 @IR("""
153 func @"testFromInt" (%0 : java.type:"PrimitiveCastTest", %1 : java.type:"int")java.type:"void" -> {
154 %2 : Var<java.type:"int"> = var %1 @"v";
155 %3 : java.type:"int" = var.load %2;
156 %4 : java.type:"double" = conv %3;
157 %5 : Var<java.type:"double"> = var %4 @"d";
158 %6 : java.type:"int" = var.load %2;
159 %7 : java.type:"float" = conv %6;
160 %8 : Var<java.type:"float"> = var %7 @"f";
161 %9 : java.type:"int" = var.load %2;
162 %10 : java.type:"long" = conv %9;
163 %11 : Var<java.type:"long"> = var %10 @"l";
164 %12 : java.type:"int" = var.load %2;
165 %13 : Var<java.type:"int"> = var %12 @"i";
166 %14 : java.type:"int" = var.load %2;
167 %15 : java.type:"short" = conv %14;
168 %16 : Var<java.type:"short"> = var %15 @"s";
169 %17 : java.type:"int" = var.load %2;
170 %18 : java.type:"char" = conv %17;
171 %19 : Var<java.type:"char"> = var %18 @"c";
172 %20 : java.type:"int" = var.load %2;
173 %21 : java.type:"byte" = conv %20;
174 %22 : Var<java.type:"byte"> = var %21 @"b";
175 return;
176 };
177 """)
178 @SuppressWarnings("cast")
179 void testFromInt(int v) {
180 double d = (double) v;
181 float f = (float) v;
182 long l = (long) v;
183 int i = (int) v;
184 short s = (short) v;
185 char c = (char) v;
186 byte b = (byte) v;
187 }
188
189 @CodeReflection
190 @IR("""
191 func @"testFromShort" (%0 : java.type:"PrimitiveCastTest", %1 : java.type:"short")java.type:"void" -> {
192 %2 : Var<java.type:"short"> = var %1 @"v";
193 %3 : java.type:"short" = var.load %2;
194 %4 : java.type:"double" = conv %3;
195 %5 : Var<java.type:"double"> = var %4 @"d";
196 %6 : java.type:"short" = var.load %2;
197 %7 : java.type:"float" = conv %6;
198 %8 : Var<java.type:"float"> = var %7 @"f";
199 %9 : java.type:"short" = var.load %2;
200 %10 : java.type:"long" = conv %9;
201 %11 : Var<java.type:"long"> = var %10 @"l";
202 %12 : java.type:"short" = var.load %2;
203 %13 : java.type:"int" = conv %12;
204 %14 : Var<java.type:"int"> = var %13 @"i";
205 %15 : java.type:"short" = var.load %2;
206 %16 : Var<java.type:"short"> = var %15 @"s";
207 %17 : java.type:"short" = var.load %2;
208 %18 : java.type:"char" = conv %17;
209 %19 : Var<java.type:"char"> = var %18 @"c";
210 %20 : java.type:"short" = var.load %2;
211 %21 : java.type:"byte" = conv %20;
212 %22 : Var<java.type:"byte"> = var %21 @"b";
213 return;
214 };
215 """)
216 @SuppressWarnings("cast")
217 void testFromShort(short v) {
218 double d = (double) v;
219 float f = (float) v;
220 long l = (long) v;
221 int i = (int) v;
222 short s = (short) v;
223 char c = (char) v;
224 byte b = (byte) v;
225 }
226
227 @CodeReflection
228 @IR("""
229 func @"testFromChar" (%0 : java.type:"PrimitiveCastTest", %1 : java.type:"char")java.type:"void" -> {
230 %2 : Var<java.type:"char"> = var %1 @"v";
231 %3 : java.type:"char" = var.load %2;
232 %4 : java.type:"double" = conv %3;
233 %5 : Var<java.type:"double"> = var %4 @"d";
234 %6 : java.type:"char" = var.load %2;
235 %7 : java.type:"float" = conv %6;
236 %8 : Var<java.type:"float"> = var %7 @"f";
237 %9 : java.type:"char" = var.load %2;
238 %10 : java.type:"long" = conv %9;
239 %11 : Var<java.type:"long"> = var %10 @"l";
240 %12 : java.type:"char" = var.load %2;
241 %13 : java.type:"int" = conv %12;
242 %14 : Var<java.type:"int"> = var %13 @"i";
243 %15 : java.type:"char" = var.load %2;
244 %16 : java.type:"short" = conv %15;
245 %17 : Var<java.type:"short"> = var %16 @"s";
246 %18 : java.type:"char" = var.load %2;
247 %19 : Var<java.type:"char"> = var %18 @"c";
248 %20 : java.type:"char" = var.load %2;
249 %21 : java.type:"byte" = conv %20;
250 %22 : Var<java.type:"byte"> = var %21 @"b";
251 return;
252 };
253 """)
254 @SuppressWarnings("cast")
255 void testFromChar(char v) {
256 double d = (double) v;
257 float f = (float) v;
258 long l = (long) v;
259 int i = (int) v;
260 short s = (short) v;
261 char c = (char) v;
262 byte b = (byte) v;
263 }
264
265 @CodeReflection
266 @IR("""
267 func @"testFromByte" (%0 : java.type:"PrimitiveCastTest", %1 : java.type:"byte")java.type:"void" -> {
268 %2 : Var<java.type:"byte"> = var %1 @"v";
269 %3 : java.type:"byte" = var.load %2;
270 %4 : java.type:"double" = conv %3;
271 %5 : Var<java.type:"double"> = var %4 @"d";
272 %6 : java.type:"byte" = var.load %2;
273 %7 : java.type:"float" = conv %6;
274 %8 : Var<java.type:"float"> = var %7 @"f";
275 %9 : java.type:"byte" = var.load %2;
276 %10 : java.type:"long" = conv %9;
277 %11 : Var<java.type:"long"> = var %10 @"l";
278 %12 : java.type:"byte" = var.load %2;
279 %13 : java.type:"int" = conv %12;
280 %14 : Var<java.type:"int"> = var %13 @"i";
281 %15 : java.type:"byte" = var.load %2;
282 %16 : java.type:"short" = conv %15;
283 %17 : Var<java.type:"short"> = var %16 @"s";
284 %18 : java.type:"byte" = var.load %2;
285 %19 : java.type:"char" = conv %18;
286 %20 : Var<java.type:"char"> = var %19 @"c";
287 %21 : java.type:"byte" = var.load %2;
288 %22 : Var<java.type:"byte"> = var %21 @"b";
289 return;
290 };
291 """)
292 @SuppressWarnings("cast")
293 void testFromByte(byte v) {
294 double d = (double) v;
295 float f = (float) v;
296 long l = (long) v;
297 int i = (int) v;
298 short s = (short) v;
299 char c = (char) v;
300 byte b = (byte) v;
301 }
302 }