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 jdk.incubator.code.CodeReflection;
25 import java.util.function.Supplier;
26
27 /*
28 * @test
29 * @summary Smoke test for code reflection with boxing conversions.
30 * @modules jdk.incubator.code
31 * @build BoxingConversionTest
32 * @build CodeReflectionTester
33 * @run main CodeReflectionTester BoxingConversionTest
34 */
35
36 public class BoxingConversionTest {
37 @CodeReflection
38 @IR("""
39 func @"test1" (%0 : java.type:"BoxingConversionTest")java.type:"void" -> {
40 %1 : java.type:"long" = constant @1;
41 %2 : java.type:"java.lang.Long" = invoke %1 @java.ref:"java.lang.Long::valueOf(long):java.lang.Long";
42 %3 : Var<java.type:"java.lang.Long"> = var %2 @"x";
43 return;
44 };
45 """)
46 void test1() {
47 Long x = 1L;
48 }
49
50 @CodeReflection
51 @IR("""
52 func @"test2" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"java.lang.Long")java.type:"void" -> {
53 %2 : Var<java.type:"java.lang.Long"> = var %1 @"L";
54 %3 : java.type:"java.lang.Long" = var.load %2;
55 %4 : java.type:"long" = invoke %3 @java.ref:"java.lang.Long::longValue():long";
56 %5 : Var<java.type:"long"> = var %4 @"l";
57 return;
58 };
59 """)
60 void test2(Long L) {
61 long l = L;
62 }
63
64 @CodeReflection
65 @IR("""
66 func @"test3" (%0 : java.type:"BoxingConversionTest")java.type:"void" -> {
67 %1 : java.type:"long" = constant @0;
68 %2 : java.type:"java.lang.Long" = invoke %1 @java.ref:"java.lang.Long::valueOf(long):java.lang.Long";
69 %3 : Var<java.type:"java.lang.Object"> = var %2 @"o";
70 return;
71 };
72 """)
73 void test3() {
74 Object o = 0L;
75 }
76
77 @CodeReflection
78 @IR("""
79 func @"test4" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"java.lang.Object")java.type:"void" -> {
80 %2 : Var<java.type:"java.lang.Object"> = var %1 @"o";
81 %3 : java.type:"java.lang.Object" = var.load %2;
82 %4 : java.type:"java.lang.Long" = cast %3 @java.type:"java.lang.Long";
83 %5 : java.type:"long" = invoke %4 @java.ref:"java.lang.Long::longValue():long";
84 %6 : Var<java.type:"long"> = var %5 @"l";
85 return;
86 };
87 """)
88 void test4(Object o) {
89 long l = (long)o;
90 }
91
92 @CodeReflection
93 @IR("""
94 func @"test5" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"java.lang.Integer")java.type:"void" -> {
95 %2 : Var<java.type:"java.lang.Integer"> = var %1 @"i2";
96 %3 : java.type:"java.lang.Integer" = var.load %2;
97 %4 : java.type:"int" = constant @1;
98 %5 : java.type:"int" = invoke %3 @java.ref:"java.lang.Integer::intValue():int";
99 %6 : java.type:"int" = add %5 %4;
100 %7 : java.type:"java.lang.Integer" = invoke %6 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
101 var.store %2 %7;
102 return;
103 };
104 """)
105 void test5(Integer i2) {
106 i2++;
107 }
108
109 @CodeReflection
110 @IR("""
111 func @"test6" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"java.lang.Integer")java.type:"void" -> {
112 %2 : Var<java.type:"java.lang.Integer"> = var %1 @"i2";
113 %3 : java.type:"java.lang.Integer" = var.load %2;
114 %4 : java.type:"int" = constant @3;
115 %5 : java.type:"int" = invoke %3 @java.ref:"java.lang.Integer::intValue():int";
116 %6 : java.type:"int" = add %5 %4;
117 %7 : java.type:"java.lang.Integer" = invoke %6 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
118 var.store %2 %7;
119 return;
120 };
121 """)
122 void test6(Integer i2) {
123 i2 += 3;
124 }
125
126 static class Box {
127 Integer i;
128 }
129
130 @CodeReflection
131 @IR("""
132 func @"test7" (%0 : java.type:"BoxingConversionTest")java.type:"void" -> {
133 %1 : java.type:"BoxingConversionTest$Box" = new @java.ref:"BoxingConversionTest$Box::()";
134 %2 : java.type:"java.lang.Integer" = field.load %1 @java.ref:"BoxingConversionTest$Box::i:java.lang.Integer";
135 %3 : java.type:"int" = constant @1;
136 %4 : java.type:"int" = invoke %2 @java.ref:"java.lang.Integer::intValue():int";
137 %5 : java.type:"int" = add %4 %3;
138 %6 : java.type:"java.lang.Integer" = invoke %5 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
139 field.store %1 %6 @java.ref:"BoxingConversionTest$Box::i:java.lang.Integer";
140 return;
141 };
142 """)
143 void test7() {
144 new Box().i++;
145 }
146
147 @CodeReflection
148 @IR("""
149 func @"test8" (%0 : java.type:"BoxingConversionTest")java.type:"void" -> {
150 %1 : java.type:"BoxingConversionTest$Box" = new @java.ref:"BoxingConversionTest$Box::()";
151 %2 : java.type:"java.lang.Integer" = field.load %1 @java.ref:"BoxingConversionTest$Box::i:java.lang.Integer";
152 %3 : java.type:"int" = constant @3;
153 %4 : java.type:"int" = invoke %2 @java.ref:"java.lang.Integer::intValue():int";
154 %5 : java.type:"int" = add %4 %3;
155 %6 : java.type:"java.lang.Integer" = invoke %5 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
156 field.store %1 %6 @java.ref:"BoxingConversionTest$Box::i:java.lang.Integer";
157 return;
158 };
159 """)
160 void test8() {
161 new Box().i += 3;
162 }
163
164 @CodeReflection
165 @IR("""
166 func @"test9" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int[]", %2 : java.type:"java.lang.Integer")java.type:"void" -> {
167 %3 : Var<java.type:"int[]"> = var %1 @"ia";
168 %4 : Var<java.type:"java.lang.Integer"> = var %2 @"i";
169 %5 : java.type:"int[]" = var.load %3;
170 %6 : java.type:"int" = constant @0;
171 %7 : java.type:"int" = array.load %5 %6;
172 %8 : java.type:"java.lang.Integer" = var.load %4;
173 %9 : java.type:"int" = invoke %8 @java.ref:"java.lang.Integer::intValue():int";
174 %10 : java.type:"int" = add %7 %9;
175 array.store %5 %6 %10;
176 return;
177 };
178 """)
179 void test9(int[] ia, Integer i) {
180 ia[0] += i;
181 }
182
183 @CodeReflection
184 @IR("""
185 func @"test10" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"boolean", %2 : java.type:"java.lang.Integer")java.type:"void" -> {
186 %3 : Var<java.type:"boolean"> = var %1 @"cond";
187 %4 : Var<java.type:"java.lang.Integer"> = var %2 @"I";
188 %5 : java.type:"int" = java.cexpression
189 ()java.type:"boolean" -> {
190 %6 : java.type:"boolean" = var.load %3;
191 yield %6;
192 }
193 ()java.type:"int" -> {
194 %7 : java.type:"java.lang.Integer" = var.load %4;
195 %8 : java.type:"int" = invoke %7 @java.ref:"java.lang.Integer::intValue():int";
196 yield %8;
197 }
198 ()java.type:"int" -> {
199 %9 : java.type:"int" = constant @2;
200 yield %9;
201 };
202 %10 : Var<java.type:"int"> = var %5 @"res";
203 return;
204 };
205 """)
206 void test10(boolean cond, Integer I) {
207 int res = cond ? I : 2;
208 }
209
210 @CodeReflection
211 @IR("""
212 func @"test11" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"boolean", %2 : java.type:"java.lang.Integer")java.type:"void" -> {
213 %3 : Var<java.type:"boolean"> = var %1 @"cond";
214 %4 : Var<java.type:"java.lang.Integer"> = var %2 @"I";
215 %5 : java.type:"int" = java.cexpression
216 ()java.type:"boolean" -> {
217 %6 : java.type:"boolean" = var.load %3;
218 yield %6;
219 }
220 ()java.type:"int" -> {
221 %7 : java.type:"int" = constant @2;
222 yield %7;
223 }
224 ()java.type:"int" -> {
225 %8 : java.type:"java.lang.Integer" = var.load %4;
226 %9 : java.type:"int" = invoke %8 @java.ref:"java.lang.Integer::intValue():int";
227 yield %9;
228 };
229 %10 : Var<java.type:"int"> = var %5 @"res";
230 return;
231 };
232 """)
233 void test11(boolean cond, Integer I) {
234 int res = cond ? 2 : I;
235 }
236
237 @CodeReflection
238 @IR("""
239 func @"test12" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"boolean")java.type:"void" -> {
240 %2 : Var<java.type:"boolean"> = var %1 @"cond";
241 %3 : java.type:"int" = java.cexpression
242 ()java.type:"boolean" -> {
243 %4 : java.type:"boolean" = var.load %2;
244 yield %4;
245 }
246 ()java.type:"int" -> {
247 %5 : java.type:"int" = constant @1;
248 yield %5;
249 }
250 ()java.type:"int" -> {
251 %6 : java.type:"int" = constant @2;
252 yield %6;
253 };
254 %7 : java.type:"java.lang.Integer" = invoke %3 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
255 %8 : Var<java.type:"java.lang.Integer"> = var %7 @"x";
256 return;
257 };
258 """)
259 void test12(boolean cond) {
260 Integer x = cond ? 1 : 2;
261 }
262
263 @CodeReflection
264 @IR("""
265 func @"test13" (%0 : java.type:"BoxingConversionTest")java.type:"void" -> {
266 %1 : java.type:"java.util.function.Supplier<java.lang.Integer>" = lambda ()java.type:"java.lang.Integer" -> {
267 %2 : java.type:"int" = constant @1;
268 %3 : java.type:"java.lang.Integer" = invoke %2 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
269 return %3;
270 };
271 %4 : Var<java.type:"java.util.function.Supplier<java.lang.Integer>"> = var %1 @"s";
272 return;
273 };
274 """)
275 void test13() {
276 Supplier<Integer> s = () -> { return 1; };
277 }
278
279 @CodeReflection
280 @IR("""
281 func @"test14" (%0 : java.type:"BoxingConversionTest")java.type:"void" -> {
282 %1 : java.type:"java.util.function.Supplier<java.lang.Integer>" = lambda ()java.type:"java.lang.Integer" -> {
283 %2 : java.type:"int" = constant @1;
284 %3 : java.type:"java.lang.Integer" = invoke %2 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
285 return %3;
286 };
287 %4 : Var<java.type:"java.util.function.Supplier<java.lang.Integer>"> = var %1 @"s";
288 return;
289 };
290 """)
291 void test14() {
292 Supplier<Integer> s = () -> 1;
293 }
294
295 @CodeReflection
296 @IR("""
297 func @"test15" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int", %2 : java.type:"java.lang.Integer")java.type:"void" -> {
298 %3 : Var<java.type:"int"> = var %1 @"i";
299 %4 : Var<java.type:"java.lang.Integer"> = var %2 @"I";
300 %5 : java.type:"int" = var.load %3;
301 %6 : java.type:"int" = java.switch.expression %5
302 (%7 : java.type:"int")java.type:"boolean" -> {
303 %8 : java.type:"int" = constant @1;
304 %9 : java.type:"boolean" = eq %7 %8;
305 yield %9;
306 }
307 ()java.type:"int" -> {
308 %10 : java.type:"java.lang.Integer" = var.load %4;
309 %11 : java.type:"int" = invoke %10 @java.ref:"java.lang.Integer::intValue():int";
310 yield %11;
311 }
312 ()java.type:"boolean" -> {
313 %12 : java.type:"boolean" = constant @true;
314 yield %12;
315 }
316 ()java.type:"int" -> {
317 %13 : java.type:"int" = constant @0;
318 yield %13;
319 };
320 %14 : Var<java.type:"int"> = var %6 @"x";
321 return;
322 };
323 """)
324 void test15(int i, Integer I) {
325 int x = switch (i) {
326 case 1 -> I;
327 default -> 0;
328 };
329 }
330
331 @CodeReflection
332 @IR("""
333 func @"test16" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int", %2 : java.type:"java.lang.Integer")java.type:"void" -> {
334 %3 : Var<java.type:"int"> = var %1 @"i";
335 %4 : Var<java.type:"java.lang.Integer"> = var %2 @"I";
336 %5 : java.type:"int" = var.load %3;
337 %6 : java.type:"int" = java.switch.expression %5
338 (%7 : java.type:"int")java.type:"boolean" -> {
339 %8 : java.type:"int" = constant @1;
340 %9 : java.type:"boolean" = eq %7 %8;
341 yield %9;
342 }
343 ()java.type:"int" -> {
344 %10 : java.type:"int" = constant @1;
345 yield %10;
346 }
347 ()java.type:"boolean" -> {
348 %11 : java.type:"boolean" = constant @true;
349 yield %11;
350 }
351 ()java.type:"int" -> {
352 %12 : java.type:"java.lang.Integer" = var.load %4;
353 %13 : java.type:"int" = invoke %12 @java.ref:"java.lang.Integer::intValue():int";
354 yield %13;
355 };
356 %14 : Var<java.type:"int"> = var %6 @"x";
357 return;
358 };
359 """)
360 void test16(int i, Integer I) {
361 int x = switch (i) {
362 case 1 -> 1;
363 default -> I;
364 };
365 }
366
367 @CodeReflection
368 @IR("""
369 func @"test17" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
370 %2 : Var<java.type:"int"> = var %1 @"i";
371 %3 : java.type:"int" = var.load %2;
372 %4 : java.type:"java.lang.Integer" = java.switch.expression %3
373 (%5 : java.type:"int")java.type:"boolean" -> {
374 %6 : java.type:"int" = constant @1;
375 %7 : java.type:"boolean" = eq %5 %6;
376 yield %7;
377 }
378 ()java.type:"java.lang.Integer" -> {
379 %8 : java.type:"int" = constant @1;
380 %9 : java.type:"java.lang.Integer" = invoke %8 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
381 yield %9;
382 }
383 ()java.type:"boolean" -> {
384 %10 : java.type:"boolean" = constant @true;
385 yield %10;
386 }
387 ()java.type:"java.lang.Integer" -> {
388 %11 : java.type:"int" = constant @0;
389 %12 : java.type:"java.lang.Integer" = invoke %11 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
390 yield %12;
391 };
392 %13 : Var<java.type:"java.lang.Integer"> = var %4 @"x";
393 return;
394 };
395 """)
396 void test17(int i) {
397 Integer x = switch (i) {
398 case 1 -> 1;
399 default -> 0;
400 };
401 }
402
403 @CodeReflection
404 @IR("""
405 func @"test18" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int", %2 : java.type:"java.lang.Integer")java.type:"void" -> {
406 %3 : Var<java.type:"int"> = var %1 @"i";
407 %4 : Var<java.type:"java.lang.Integer"> = var %2 @"I";
408 %5 : java.type:"int" = var.load %3;
409 %6 : java.type:"int" = java.switch.expression %5
410 (%7 : java.type:"int")java.type:"boolean" -> {
411 %8 : java.type:"int" = constant @1;
412 %9 : java.type:"boolean" = eq %7 %8;
413 yield %9;
414 }
415 ()java.type:"int" -> {
416 %10 : java.type:"java.lang.Integer" = var.load %4;
417 %11 : java.type:"int" = invoke %10 @java.ref:"java.lang.Integer::intValue():int";
418 java.yield %11;
419 }
420 ()java.type:"boolean" -> {
421 %12 : java.type:"boolean" = constant @true;
422 yield %12;
423 }
424 ()java.type:"int" -> {
425 %13 : java.type:"int" = constant @0;
426 java.yield %13;
427 };
428 %14 : Var<java.type:"int"> = var %6 @"x";
429 return;
430 };
431 """)
432 void test18(int i, Integer I) {
433 int x = switch (i) {
434 case 1 -> { yield I; }
435 default -> { yield 0; }
436 };
437 }
438
439 @CodeReflection
440 @IR("""
441 func @"test19" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int", %2 : java.type:"java.lang.Integer")java.type:"void" -> {
442 %3 : Var<java.type:"int"> = var %1 @"i";
443 %4 : Var<java.type:"java.lang.Integer"> = var %2 @"I";
444 %5 : java.type:"int" = var.load %3;
445 %6 : java.type:"int" = java.switch.expression %5
446 (%7 : java.type:"int")java.type:"boolean" -> {
447 %8 : java.type:"int" = constant @1;
448 %9 : java.type:"boolean" = eq %7 %8;
449 yield %9;
450 }
451 ()java.type:"int" -> {
452 %10 : java.type:"int" = constant @1;
453 java.yield %10;
454 }
455 ()java.type:"boolean" -> {
456 %11 : java.type:"boolean" = constant @true;
457 yield %11;
458 }
459 ()java.type:"int" -> {
460 %12 : java.type:"java.lang.Integer" = var.load %4;
461 %13 : java.type:"int" = invoke %12 @java.ref:"java.lang.Integer::intValue():int";
462 java.yield %13;
463 };
464 %14 : Var<java.type:"int"> = var %6 @"x";
465 return;
466 };
467 """)
468 void test19(int i, Integer I) {
469 int x = switch (i) {
470 case 1 -> { yield 1; }
471 default -> { yield I; }
472 };
473 }
474
475 @CodeReflection
476 @IR("""
477 func @"test20" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
478 %2 : Var<java.type:"int"> = var %1 @"i";
479 %3 : java.type:"int" = var.load %2;
480 %4 : java.type:"java.lang.Integer" = java.switch.expression %3
481 (%5 : java.type:"int")java.type:"boolean" -> {
482 %6 : java.type:"int" = constant @1;
483 %7 : java.type:"boolean" = eq %5 %6;
484 yield %7;
485 }
486 ()java.type:"java.lang.Integer" -> {
487 %8 : java.type:"int" = constant @1;
488 %9 : java.type:"java.lang.Integer" = invoke %8 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
489 java.yield %9;
490 }
491 ()java.type:"boolean" -> {
492 %10 : java.type:"boolean" = constant @true;
493 yield %10;
494 }
495 ()java.type:"java.lang.Integer" -> {
496 %11 : java.type:"int" = constant @0;
497 %12 : java.type:"java.lang.Integer" = invoke %11 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
498 java.yield %12;
499 };
500 %13 : Var<java.type:"java.lang.Integer"> = var %4 @"x";
501 return;
502 };
503 """)
504 void test20(int i) {
505 Integer x = switch (i) {
506 case 1 -> { yield 1; }
507 default -> { yield 0; }
508 };
509 }
510
511 @CodeReflection
512 @IR("""
513 func @"test21" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int", %2 : java.type:"java.lang.Integer")java.type:"void" -> {
514 %3 : Var<java.type:"int"> = var %1 @"i";
515 %4 : Var<java.type:"java.lang.Integer"> = var %2 @"I";
516 %5 : java.type:"int" = var.load %3;
517 %6 : java.type:"java.lang.Integer" = var.load %4;
518 %7 : java.type:"int" = invoke %6 @java.ref:"java.lang.Integer::intValue():int";
519 %8 : java.type:"int" = add %5 %7;
520 %9 : Var<java.type:"int"> = var %8 @"l";
521 return;
522 };
523 """)
524 void test21(int i, Integer I) {
525 int l = i + I;
526 }
527
528 void m(Integer I) { }
529
530 @CodeReflection
531 @IR("""
532 func @"test22" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
533 %2 : Var<java.type:"int"> = var %1 @"i";
534 %3 : java.type:"int" = var.load %2;
535 %4 : java.type:"java.lang.Integer" = invoke %3 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
536 invoke %0 %4 @java.ref:"BoxingConversionTest::m(java.lang.Integer):void";
537 return;
538 };
539 """)
540 void test22(int i) {
541 m(i);
542 }
543
544 void m(int i1, int i2, Integer... I) { }
545
546 @CodeReflection
547 @IR("""
548 func @"test23" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
549 %2 : Var<java.type:"int"> = var %1 @"i";
550 %3 : java.type:"int" = var.load %2;
551 %4 : java.type:"int" = var.load %2;
552 invoke %0 %3 %4 @java.ref:"BoxingConversionTest::m(int, int, java.lang.Integer[]):void" @invoke.kind="INSTANCE" @invoke.varargs=true;
553 return;
554 };
555 """)
556 void test23(int i) {
557 m(i, i);
558 }
559
560 @CodeReflection
561 @IR("""
562 func @"test24" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
563 %2 : Var<java.type:"int"> = var %1 @"i";
564 %3 : java.type:"int" = var.load %2;
565 %4 : java.type:"int" = var.load %2;
566 %5 : java.type:"int" = var.load %2;
567 %6 : java.type:"java.lang.Integer" = invoke %5 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
568 invoke %0 %3 %4 %6 @java.ref:"BoxingConversionTest::m(int, int, java.lang.Integer[]):void" @invoke.kind="INSTANCE" @invoke.varargs=true;
569 return;
570 };
571 """)
572 void test24(int i) {
573 m(i, i, i);
574 }
575
576 @CodeReflection
577 @IR("""
578 func @"test25" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
579 %2 : Var<java.type:"int"> = var %1 @"i";
580 %3 : java.type:"int" = var.load %2;
581 %4 : java.type:"int" = var.load %2;
582 %5 : java.type:"int" = var.load %2;
583 %6 : java.type:"java.lang.Integer" = invoke %5 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
584 %7 : java.type:"int" = var.load %2;
585 %8 : java.type:"java.lang.Integer" = invoke %7 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
586 invoke %0 %3 %4 %6 %8 @java.ref:"BoxingConversionTest::m(int, int, java.lang.Integer[]):void" @invoke.kind="INSTANCE" @invoke.varargs=true;
587 return;
588 };
589 """)
590 void test25(int i) {
591 m(i, i, i, i);
592 }
593
594 static class Box2 {
595 Box2(Integer I) { }
596 Box2(int i1, int i2, Integer... Is) { }
597 }
598
599 @CodeReflection
600 @IR("""
601 func @"test26" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
602 %2 : Var<java.type:"int"> = var %1 @"i";
603 %3 : java.type:"int" = var.load %2;
604 %4 : java.type:"java.lang.Integer" = invoke %3 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
605 %5 : java.type:"BoxingConversionTest$Box2" = new %4 @java.ref:"BoxingConversionTest$Box2::(java.lang.Integer)";
606 return;
607 };
608 """)
609 void test26(int i) {
610 new Box2(i);
611 }
612
613 @CodeReflection
614 @IR("""
615 func @"test27" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
616 %2 : Var<java.type:"int"> = var %1 @"i";
617 %3 : java.type:"int" = var.load %2;
618 %4 : java.type:"int" = var.load %2;
619 %5 : java.type:"BoxingConversionTest$Box2" = new %3 %4 @java.ref:"BoxingConversionTest$Box2::(int, int, java.lang.Integer[])" @new.varargs=true;
620 return;
621 };
622 """)
623 void test27(int i) {
624 new Box2(i, i);
625 }
626
627 @CodeReflection
628 @IR("""
629 func @"test28" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
630 %2 : Var<java.type:"int"> = var %1 @"i";
631 %3 : java.type:"int" = var.load %2;
632 %4 : java.type:"int" = var.load %2;
633 %5 : java.type:"int" = var.load %2;
634 %6 : java.type:"java.lang.Integer" = invoke %5 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
635 %7 : java.type:"BoxingConversionTest$Box2" = new %3 %4 %6 @java.ref:"BoxingConversionTest$Box2::(int, int, java.lang.Integer[])" @new.varargs=true;
636 return;
637 };
638 """)
639 void test28(int i) {
640 new Box2(i, i, i);
641 }
642
643 @CodeReflection
644 @IR("""
645 func @"test29" (%0 : java.type:"BoxingConversionTest", %1 : java.type:"int")java.type:"void" -> {
646 %2 : Var<java.type:"int"> = var %1 @"i";
647 %3 : java.type:"int" = var.load %2;
648 %4 : java.type:"int" = var.load %2;
649 %5 : java.type:"int" = var.load %2;
650 %6 : java.type:"java.lang.Integer" = invoke %5 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
651 %7 : java.type:"int" = var.load %2;
652 %8 : java.type:"java.lang.Integer" = invoke %7 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
653 %9 : java.type:"BoxingConversionTest$Box2" = new %3 %4 %6 %8 @java.ref:"BoxingConversionTest$Box2::(int, int, java.lang.Integer[])" @new.varargs=true;
654 return;
655 };
656 """)
657 void test29(int i) {
658 new Box2(i, i, i, i);
659 }
660
661 @CodeReflection
662 @IR("""
663 func @"test30" (%0 : java.type:"java.lang.Integer")java.type:"void" -> {
664 %1 : Var<java.type:"java.lang.Integer"> = var %0 @"i";
665 %2 : java.type:"java.lang.Integer" = var.load %1;
666 %3 : java.type:"int" = invoke %2 @java.ref:"java.lang.Integer::intValue():int";
667 %4 : java.type:"int" = neg %3;
668 %5 : Var<java.type:"int"> = var %4 @"j";
669 return;
670 };
671 """)
672 static void test30(Integer i) {
673 int j = -i;
674 }
675
676 @CodeReflection
677 @IR("""
678 func @"test31" (%0 : java.type:"int")java.type:"void" -> {
679 %1 : Var<java.type:"int"> = var %0 @"i";
680 %2 : java.type:"int" = var.load %1;
681 %3 : java.type:"int" = neg %2;
682 %4 : java.type:"java.lang.Integer" = invoke %3 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
683 %5 : Var<java.type:"java.lang.Integer"> = var %4 @"j";
684 return;
685 };
686 """)
687 static void test31(int i) {
688 Integer j = -i;
689 }
690
691 @CodeReflection
692 @IR("""
693 func @"test32" (%0 : java.type:"boolean")java.type:"void" -> {
694 %1 : Var<java.type:"boolean"> = var %0 @"i";
695 %2 : java.type:"boolean" = var.load %1;
696 %3 : java.type:"boolean" = not %2;
697 %4 : java.type:"java.lang.Boolean" = invoke %3 @java.ref:"java.lang.Boolean::valueOf(boolean):java.lang.Boolean";
698 %5 : Var<java.type:"java.lang.Boolean"> = var %4 @"j";
699 return;
700 };
701 """)
702 static void test32(boolean i) {
703 Boolean j = !i;
704 }
705
706 @CodeReflection
707 @IR("""
708 func @"test33" (%0 : java.type:"java.lang.Boolean")java.type:"void" -> {
709 %1 : Var<java.type:"java.lang.Boolean"> = var %0 @"i";
710 %2 : java.type:"java.lang.Boolean" = var.load %1;
711 %3 : java.type:"boolean" = invoke %2 @java.ref:"java.lang.Boolean::booleanValue():boolean";
712 %4 : java.type:"boolean" = not %3;
713 %5 : Var<java.type:"boolean"> = var %4 @"j";
714 return;
715 };
716 """)
717 static void test33(Boolean i) {
718 boolean j = !i;
719 }
720 }