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 : BoxingConversionTest)void -> {
 40                   %1 : long = constant @"1";
 41                   %2 : java.lang.Long = invoke %1 @"java.lang.Long::valueOf(long)java.lang.Long";
 42                   %3 : Var<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 : BoxingConversionTest, %1 : java.lang.Long)void -> {
 53                 %2 : Var<java.lang.Long> = var %1 @"L";
 54                 %3 : java.lang.Long = var.load %2;
 55                 %4 : long = invoke %3 @"java.lang.Long::longValue()long";
 56                 %5 : Var<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 : BoxingConversionTest)void -> {
 67                 %1 : long = constant @"0";
 68                 %2 : java.lang.Long = invoke %1 @"java.lang.Long::valueOf(long)java.lang.Long";
 69                 %3 : Var<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 : BoxingConversionTest, %1 : java.lang.Object)void -> {
 80                 %2 : Var<java.lang.Object> = var %1 @"o";
 81                 %3 : java.lang.Object = var.load %2;
 82                 %4 : java.lang.Long = cast %3 @"java.lang.Long";
 83                 %5 : long = invoke %4 @"java.lang.Long::longValue()long";
 84                 %6 : Var<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 : BoxingConversionTest, %1 : java.lang.Integer)void -> {
 95                 %2 : Var<java.lang.Integer> = var %1 @"i2";
 96                 %3 : java.lang.Integer = var.load %2;
 97                 %4 : int = constant @"1";
 98                 %5 : int = invoke %3 @"java.lang.Integer::intValue()int";
 99                 %6 : int = add %5 %4;
100                 %7 : java.lang.Integer = invoke %6 @"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 : BoxingConversionTest, %1 : java.lang.Integer)void -> {
112                 %2 : Var<java.lang.Integer> = var %1 @"i2";
113                 %3 : java.lang.Integer = var.load %2;
114                 %4 : int = constant @"3";
115                 %5 : int = invoke %3 @"java.lang.Integer::intValue()int";
116                 %6 : int = add %5 %4;
117                 %7 : java.lang.Integer = invoke %6 @"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 : BoxingConversionTest)void -> {
133                 %1 : BoxingConversionTest$Box = new @"func<BoxingConversionTest$Box>";
134                 %2 : java.lang.Integer = field.load %1 @"BoxingConversionTest$Box::i()java.lang.Integer";
135                 %3 : int = constant @"1";
136                 %4 : int = invoke %2 @"java.lang.Integer::intValue()int";
137                 %5 : int = add %4 %3;
138                 %6 : java.lang.Integer = invoke %5 @"java.lang.Integer::valueOf(int)java.lang.Integer";
139                 field.store %1 %6 @"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 : BoxingConversionTest)void -> {
150                 %1 : BoxingConversionTest$Box = new @"func<BoxingConversionTest$Box>";
151                 %2 : java.lang.Integer = field.load %1 @"BoxingConversionTest$Box::i()java.lang.Integer";
152                 %3 : int = constant @"3";
153                 %4 : int = invoke %2 @"java.lang.Integer::intValue()int";
154                 %5 : int = add %4 %3;
155                 %6 : java.lang.Integer = invoke %5 @"java.lang.Integer::valueOf(int)java.lang.Integer";
156                 field.store %1 %6 @"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 : BoxingConversionTest, %1 : int[], %2 : java.lang.Integer)void -> {
167                 %3 : Var<int[]> = var %1 @"ia";
168                 %4 : Var<java.lang.Integer> = var %2 @"i";
169                 %5 : int[] = var.load %3;
170                 %6 : int = constant @"0";
171                 %7 : int = array.load %5 %6;
172                 %8 : java.lang.Integer = var.load %4;
173                 %9 : int = invoke %8 @"java.lang.Integer::intValue()int";
174                 %10 : 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 : BoxingConversionTest, %1 : boolean, %2 : java.lang.Integer)void -> {
186                 %3 : Var<boolean> = var %1 @"cond";
187                 %4 : Var<java.lang.Integer> = var %2 @"I";
188                 %5 : int = java.cexpression
189                     ^cond()boolean -> {
190                         %6 : boolean = var.load %3;
191                         yield %6;
192                     }
193                     ^truepart()int -> {
194                         %7 : java.lang.Integer = var.load %4;
195                         %8 : int = invoke %7 @"java.lang.Integer::intValue()int";
196                         yield %8;
197                     }
198                     ^falsepart()int -> {
199                         %9 : int = constant @"2";
200                         yield %9;
201                     };
202                 %10 : Var<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 : BoxingConversionTest, %1 : boolean, %2 : java.lang.Integer)void -> {
213                 %3 : Var<boolean> = var %1 @"cond";
214                 %4 : Var<java.lang.Integer> = var %2 @"I";
215                 %5 : int = java.cexpression
216                     ^cond()boolean -> {
217                         %6 : boolean = var.load %3;
218                         yield %6;
219                     }
220                     ^truepart()int -> {
221                         %7 : int = constant @"2";
222                         yield %7;
223                     }
224                     ^falsepart()int -> {
225                         %8 : java.lang.Integer = var.load %4;
226                         %9 : int = invoke %8 @"java.lang.Integer::intValue()int";
227                         yield %9;
228                     };
229                 %10 : Var<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 : BoxingConversionTest, %1 : boolean)void -> {
240                  %2 : Var<boolean> = var %1 @"cond";
241                  %3 : int = java.cexpression
242                      ^cond()boolean -> {
243                          %4 : boolean = var.load %2;
244                          yield %4;
245                      }
246                      ^truepart()int -> {
247                          %5 : int = constant @"1";
248                          yield %5;
249                      }
250                      ^falsepart()int -> {
251                          %6 : int = constant @"2";
252                          yield %6;
253                      };
254                  %7 : java.lang.Integer = invoke %3 @"java.lang.Integer::valueOf(int)java.lang.Integer";
255                  %8 : Var<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 : BoxingConversionTest)void -> {
266                 %1 : java.util.function.Supplier<java.lang.Integer> = lambda ()java.lang.Integer -> {
267                     %2 : int = constant @"1";
268                     %3 : java.lang.Integer = invoke %2 @"java.lang.Integer::valueOf(int)java.lang.Integer";
269                     return %3;
270                 };
271                 %4 : Var<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 : BoxingConversionTest)void -> {
282                 %1 : java.util.function.Supplier<java.lang.Integer> = lambda ()java.lang.Integer -> {
283                     %2 : int = constant @"1";
284                     %3 : java.lang.Integer = invoke %2 @"java.lang.Integer::valueOf(int)java.lang.Integer";
285                     return %3;
286                 };
287                 %4 : Var<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 : BoxingConversionTest, %1 : int, %2 : java.lang.Integer)void -> {
298                 %3 : Var<int> = var %1 @"i";
299                 %4 : Var<java.lang.Integer> = var %2 @"I";
300                 %5 : int = var.load %3;
301                 %6 : int = java.switch.expression %5
302                     ^constantCaseLabel(%7 : int)boolean -> {
303                         %8 : int = constant @"1";
304                         %9 : boolean = eq %7 %8;
305                         yield %9;
306                     }
307                     ()int -> {
308                         %10 : java.lang.Integer = var.load %4;
309                         %11 : int = invoke %10 @"java.lang.Integer::intValue()int";
310                         yield %11;
311                     }
312                     ^defaultCaseLabel()boolean -> {
313                         %17 : boolean = constant @"true";
314                         yield %17;
315                     }
316                     ()int -> {
317                         %12 : int = constant @"0";
318                         yield %12;
319                     };
320                 %13 : Var<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 : BoxingConversionTest, %1 : int, %2 : java.lang.Integer)void -> {
334                 %3 : Var<int> = var %1 @"i";
335                 %4 : Var<java.lang.Integer> = var %2 @"I";
336                 %5 : int = var.load %3;
337                 %6 : int = java.switch.expression %5
338                     ^constantCaseLabel(%7 : int)boolean -> {
339                         %8 : int = constant @"1";
340                         %9 : boolean = eq %7 %8;
341                         yield %9;
342                     }
343                     ()int -> {
344                         %10 : int = constant @"1";
345                         yield %10;
346                     }
347                     ^defaultCaseLabel()boolean -> {
348                         %17 : boolean = constant @"true";
349                         yield %17;
350                     }
351                     ()int -> {
352                         %11 : java.lang.Integer = var.load %4;
353                         %12 : int = invoke %11 @"java.lang.Integer::intValue()int";
354                         yield %12;
355                     };
356                 %13 : Var<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 : BoxingConversionTest, %1 : int)void -> {
370                 %2 : Var<int> = var %1 @"i";
371                 %3 : int = var.load %2;
372                 %4 : java.lang.Integer = java.switch.expression %3
373                     ^constantCaseLabel(%5 : int)boolean -> {
374                         %6 : int = constant @"1";
375                         %7 : boolean = eq %5 %6;
376                         yield %7;
377                     }
378                     ()java.lang.Integer -> {
379                         %8 : int = constant @"1";
380                         %9 : java.lang.Integer = invoke %8 @"java.lang.Integer::valueOf(int)java.lang.Integer";
381                         yield %9;
382                     }
383                     ^defaultCaseLabel()boolean -> {
384                         %17 : boolean = constant @"true";
385                         yield %17;
386                     }
387                     ()java.lang.Integer -> {
388                         %10 : int = constant @"0";
389                         %11 : java.lang.Integer = invoke %10 @"java.lang.Integer::valueOf(int)java.lang.Integer";
390                         yield %11;
391                     };
392                 %12 : Var<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 : BoxingConversionTest, %1 : int, %2 : java.lang.Integer)void -> {
406                 %3 : Var<int> = var %1 @"i";
407                 %4 : Var<java.lang.Integer> = var %2 @"I";
408                 %5 : int = var.load %3;
409                 %6 : int = java.switch.expression %5
410                     ^constantCaseLabel(%7 : int)boolean -> {
411                         %8 : int = constant @"1";
412                         %9 : boolean = eq %7 %8;
413                         yield %9;
414                     }
415                     ()int -> {
416                         %10 : java.lang.Integer = var.load %4;
417                         %11 : int = invoke %10 @"java.lang.Integer::intValue()int";
418                         java.yield %11;
419                     }
420                     ^defaultCaseLabel()boolean -> {
421                         %17 : boolean = constant @"true";
422                         yield %17;
423                     }
424                     ()int -> {
425                         %12 : int = constant @"0";
426                         java.yield %12;
427                     };
428                 %13 : Var<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 : BoxingConversionTest, %1 : int, %2 : java.lang.Integer)void -> {
442                 %3 : Var<int> = var %1 @"i";
443                 %4 : Var<java.lang.Integer> = var %2 @"I";
444                 %5 : int = var.load %3;
445                 %6 : int = java.switch.expression %5
446                     ^constantCaseLabel(%7 : int)boolean -> {
447                         %8 : int = constant @"1";
448                         %9 : boolean = eq %7 %8;
449                         yield %9;
450                     }
451                     ()int -> {
452                         %10 : int = constant @"1";
453                         java.yield %10;
454                     }
455                     ^defaultCaseLabel()boolean -> {
456                         %17 : boolean = constant @"true";
457                         yield %17;
458                     }
459                     ()int -> {
460                         %11 : java.lang.Integer = var.load %4;
461                         %12 : int = invoke %11 @"java.lang.Integer::intValue()int";
462                         java.yield %12;
463                     };
464                 %13 : Var<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 : BoxingConversionTest, %1 : int)void -> {
478                 %2 : Var<int> = var %1 @"i";
479                 %3 : int = var.load %2;
480                 %4 : java.lang.Integer = java.switch.expression %3
481                     ^constantCaseLabel(%5 : int)boolean -> {
482                         %6 : int = constant @"1";
483                         %7 : boolean = eq %5 %6;
484                         yield %7;
485                     }
486                     ()java.lang.Integer -> {
487                         %8 : int = constant @"1";
488                         %9 : java.lang.Integer = invoke %8 @"java.lang.Integer::valueOf(int)java.lang.Integer";
489                         java.yield %9;
490                     }
491                     ^defaultCaseLabel()boolean -> {
492                         %17 : boolean = constant @"true";
493                         yield %17;
494                     }
495                     ()java.lang.Integer -> {
496                         %10 : int = constant @"0";
497                         %11 : java.lang.Integer = invoke %10 @"java.lang.Integer::valueOf(int)java.lang.Integer";
498                         java.yield %11;
499                     };
500                 %12 : Var<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 : BoxingConversionTest, %1 : int, %2 : java.lang.Integer)void -> {
514                 %3 : Var<int> = var %1 @"i";
515                 %4 : Var<java.lang.Integer> = var %2 @"I";
516                 %5 : int = var.load %3;
517                 %6 : java.lang.Integer = var.load %4;
518                 %7 : int = invoke %6 @"java.lang.Integer::intValue()int";
519                 %8 : int = add %5 %7;
520                 %9 : Var<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 : BoxingConversionTest, %1 : int)void -> {
533                 %2 : Var<int> = var %1 @"i";
534                 %3 : int = var.load %2;
535                 %4 : java.lang.Integer = invoke %3 @"java.lang.Integer::valueOf(int)java.lang.Integer";
536                 invoke %0 %4 @"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 : BoxingConversionTest, %1 : int)void -> {
549                 %2 : Var<int> = var %1 @"i";
550                 %3 : int = var.load %2;
551                 %4 : int = var.load %2;
552                 invoke %0 %3 %4 @invoke.kind="INSTANCE" @invoke.varargs="true" @"BoxingConversionTest::m(int, int, java.lang.Integer[])void";
553                 return;
554             };
555             """)
556     void test23(int i) {
557         m(i, i);
558     }
559 
560     @CodeReflection
561     @IR("""
562             func @"test24" (%0 : BoxingConversionTest, %1 : int)void -> {
563                 %2 : Var<int> = var %1 @"i";
564                 %3 : int = var.load %2;
565                 %4 : int = var.load %2;
566                 %5 : int = var.load %2;
567                 %6 : java.lang.Integer = invoke %5 @"java.lang.Integer::valueOf(int)java.lang.Integer";
568                 invoke %0 %3 %4 %6 @invoke.kind="INSTANCE" @invoke.varargs="true" @"BoxingConversionTest::m(int, int, java.lang.Integer[])void";
569                 return;
570             };
571             """)
572     void test24(int i) {
573         m(i, i, i);
574     }
575 
576     @CodeReflection
577     @IR("""
578             func @"test25" (%0 : BoxingConversionTest, %1 : int)void -> {
579                 %2 : Var<int> = var %1 @"i";
580                 %3 : int = var.load %2;
581                 %4 : int = var.load %2;
582                 %5 : int = var.load %2;
583                 %6 : java.lang.Integer = invoke %5 @"java.lang.Integer::valueOf(int)java.lang.Integer";
584                 %7 : int = var.load %2;
585                 %8 : java.lang.Integer = invoke %7 @"java.lang.Integer::valueOf(int)java.lang.Integer";
586                 invoke %0 %3 %4 %6 %8 @invoke.kind="INSTANCE" @invoke.varargs="true" @"BoxingConversionTest::m(int, int, java.lang.Integer[])void";
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 : BoxingConversionTest, %1 : int)void -> {
602                 %2 : Var<int> = var %1 @"i";
603                 %3 : int = var.load %2;
604                 %4 : java.lang.Integer = invoke %3 @"java.lang.Integer::valueOf(int)java.lang.Integer";
605                 %5 : BoxingConversionTest$Box2 = new %4 @"func<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 : BoxingConversionTest, %1 : int)void -> {
616                 %2 : Var<int> = var %1 @"i";
617                 %3 : int = var.load %2;
618                 %4 : int = var.load %2;
619                 %5 : BoxingConversionTest$Box2 = new %3 %4 @"func<BoxingConversionTest$Box2, int, int, java.lang.Integer[]>";
620                 return;
621             };
622             """)
623     void test27(int i) {
624         new Box2(i, i);
625     }
626 
627     @CodeReflection
628     @IR("""
629             func @"test28" (%0 : BoxingConversionTest, %1 : int)void -> {
630                 %2 : Var<int> = var %1 @"i";
631                 %3 : int = var.load %2;
632                 %4 : int = var.load %2;
633                 %5 : int = var.load %2;
634                 %6 : java.lang.Integer = invoke %5 @"java.lang.Integer::valueOf(int)java.lang.Integer";
635                 %7 : BoxingConversionTest$Box2 = new %3 %4 %6 @"func<BoxingConversionTest$Box2, int, int, java.lang.Integer[]>";
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 : BoxingConversionTest, %1 : int)void -> {
646                 %2 : Var<int> = var %1 @"i";
647                 %3 : int = var.load %2;
648                 %4 : int = var.load %2;
649                 %5 : int = var.load %2;
650                 %6 : java.lang.Integer = invoke %5 @"java.lang.Integer::valueOf(int)java.lang.Integer";
651                 %7 : int = var.load %2;
652                 %8 : java.lang.Integer = invoke %7 @"java.lang.Integer::valueOf(int)java.lang.Integer";
653                 %9 : BoxingConversionTest$Box2 = new %3 %4 %6 %8 @"func<BoxingConversionTest$Box2, int, int, java.lang.Integer[]>";
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.lang.Integer)void -> {
664                   %1 : Var<java.lang.Integer> = var %0 @"i";
665                   %2 : java.lang.Integer = var.load %1;
666                   %3 : int = invoke %2 @"java.lang.Integer::intValue()int";
667                   %4 : int = neg %3;
668                   %5 : Var<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 : int)void -> {
679                   %1 : Var<int> = var %0 @"i";
680                   %2 : int = var.load %1;
681                   %3 : int = neg %2;
682                   %4 : java.lang.Integer = invoke %3 @"java.lang.Integer::valueOf(int)java.lang.Integer";
683                   %5 : Var<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 : boolean)void -> {
694                   %1 : Var<boolean> = var %0 @"i";
695                   %2 : boolean = var.load %1;
696                   %3 : boolean = not %2;
697                   %4 : java.lang.Boolean = invoke %3 @"java.lang.Boolean::valueOf(boolean)java.lang.Boolean";
698                   %5 : Var<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.lang.Boolean)void -> {
709                   %1 : Var<java.lang.Boolean> = var %0 @"i";
710                   %2 : java.lang.Boolean = var.load %1;
711                   %3 : boolean = invoke %2 @"java.lang.Boolean::booleanValue()boolean";
712                   %4 : boolean = not %3;
713                   %5 : Var<boolean> = var %4 @"j";
714                   return;
715             };
716             """)
717     static void test33(Boolean i) {
718         boolean j = !i;
719     }
720 }