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