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 }