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