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.LongSupplier; 26 27 28 /* 29 * @test 30 * @summary Smoke test for code reflection with implicit conversions. 31 * @modules jdk.incubator.code 32 * @enablePreview 33 * @build ImplicitConversionTest 34 * @build CodeReflectionTester 35 * @run main CodeReflectionTester ImplicitConversionTest 36 */ 37 38 public class ImplicitConversionTest { 39 @CodeReflection 40 @IR(""" 41 func @"test1" (%0 : java.type:"ImplicitConversionTest")java.type:"void" -> { 42 %1 : java.type:"int" = constant @1; 43 %2 : java.type:"long" = conv %1; 44 %3 : Var<java.type:"long"> = var %2 @"x"; 45 return; 46 }; 47 """) 48 void test1() { 49 long x = 1; 50 } 51 52 @CodeReflection 53 @IR(""" 54 func @"test2" (%0 : java.type:"ImplicitConversionTest")java.type:"void" -> { 55 %1 : Var<java.type:"long"> = var @"x"; 56 %2 : java.type:"int" = constant @1; 57 %3 : java.type:"long" = conv %2; 58 var.store %1 %3; 59 return; 60 }; 61 """) 62 void test2() { 63 long x; 64 x = 1; 65 } 66 67 @CodeReflection 68 @IR(""" 69 func @"test3" (%0 : java.type:"ImplicitConversionTest")java.type:"void" -> { 70 %1 : java.type:"long" = constant @0; 71 %2 : Var<java.type:"long"> = var %1 @"x"; 72 %3 : java.type:"long" = var.load %2; 73 %4 : java.type:"int" = constant @1; 74 %5 : java.type:"long" = conv %4; 75 %6 : java.type:"long" = add %3 %5; 76 var.store %2 %6; 77 return; 78 }; 79 """) 80 void test3() { 81 long x = 0L; 82 x += 1; 83 } 84 85 @CodeReflection 86 @IR(""" 87 func @"test4" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"boolean")java.type:"void" -> { 88 %2 : Var<java.type:"boolean"> = var %1 @"cond"; 89 %3 : Var<java.type:"long"> = var @"x"; 90 %4 : java.type:"long" = java.cexpression 91 ()java.type:"boolean" -> { 92 %5 : java.type:"boolean" = var.load %2; 93 yield %5; 94 } 95 ()java.type:"long" -> { 96 %6 : java.type:"long" = constant @1; 97 yield %6; 98 } 99 ()java.type:"long" -> { 100 %7 : java.type:"int" = constant @2; 101 %8 : java.type:"long" = conv %7; 102 yield %8; 103 }; 104 var.store %3 %4; 105 return; 106 }; 107 """) 108 void test4(boolean cond) { 109 long x; 110 x = cond ? 1L : 2; 111 } 112 113 @CodeReflection 114 @IR(""" 115 func @"test5" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"boolean")java.type:"void" -> { 116 %2 : Var<java.type:"boolean"> = var %1 @"cond"; 117 %3 : Var<java.type:"long"> = var @"x"; 118 %4 : java.type:"long" = java.cexpression 119 ()java.type:"boolean" -> { 120 %5 : java.type:"boolean" = var.load %2; 121 yield %5; 122 } 123 ()java.type:"long" -> { 124 %6 : java.type:"int" = constant @1; 125 %7 : java.type:"long" = conv %6; 126 yield %7; 127 } 128 ()java.type:"long" -> { 129 %8 : java.type:"long" = constant @2; 130 yield %8; 131 }; 132 var.store %3 %4; 133 return; 134 }; 135 """) 136 void test5(boolean cond) { 137 long x; 138 x = cond ? 1 : 2L; 139 } 140 141 @CodeReflection 142 @IR(""" 143 func @"test6" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"boolean")java.type:"void" -> { 144 %2 : Var<java.type:"boolean"> = var %1 @"cond"; 145 %3 : Var<java.type:"long"> = var @"x"; 146 %4 : java.type:"int" = java.cexpression 147 ()java.type:"boolean" -> { 148 %5 : java.type:"boolean" = var.load %2; 149 yield %5; 150 } 151 ()java.type:"int" -> { 152 %6 : java.type:"int" = constant @1; 153 yield %6; 154 } 155 ()java.type:"int" -> { 156 %7 : java.type:"int" = constant @2; 157 yield %7; 158 }; 159 %8 : java.type:"long" = conv %4; 160 var.store %3 %8; 161 return; 162 }; 163 """) 164 void test6(boolean cond) { 165 long x; 166 x = cond ? 1 : 2; 167 } 168 169 @CodeReflection 170 @IR(""" 171 func @"test7" (%0 : java.type:"ImplicitConversionTest")java.type:"long" -> { 172 %1 : java.type:"int" = constant @1; 173 %2 : java.type:"long" = conv %1; 174 return %2; 175 }; 176 """) 177 long test7() { 178 return 1; 179 } 180 181 @CodeReflection 182 @IR(""" 183 func @"test8" (%0 : java.type:"ImplicitConversionTest")java.type:"void" -> { 184 %1 : java.type:"java.util.function.LongSupplier" = lambda ()java.type:"long" -> { 185 %2 : java.type:"int" = constant @1; 186 %3 : java.type:"long" = conv %2; 187 return %3; 188 }; 189 %4 : Var<java.type:"java.util.function.LongSupplier"> = var %1 @"s"; 190 return; 191 }; 192 """) 193 void test8() { 194 LongSupplier s = () -> { return 1; }; 195 } 196 197 @CodeReflection 198 @IR(""" 199 func @"test9" (%0 : java.type:"ImplicitConversionTest")java.type:"void" -> { 200 %1 : java.type:"java.util.function.LongSupplier" = lambda ()java.type:"long" -> { 201 %2 : java.type:"int" = constant @1; 202 %3 : java.type:"long" = conv %2; 203 return %3; 204 }; 205 %4 : Var<java.type:"java.util.function.LongSupplier"> = var %1 @"s"; 206 return; 207 }; 208 """) 209 void test9() { 210 LongSupplier s = () -> 1; 211 } 212 213 @CodeReflection 214 @IR(""" 215 func @"test10" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 216 %2 : Var<java.type:"int"> = var %1 @"i"; 217 %3 : java.type:"int" = var.load %2; 218 %4 : java.type:"long" = java.switch.expression %3 219 (%5 : java.type:"int")java.type:"boolean" -> { 220 %6 : java.type:"int" = constant @1; 221 %7 : java.type:"boolean" = eq %5 %6; 222 yield %7; 223 } 224 ()java.type:"long" -> { 225 %8 : java.type:"long" = constant @1; 226 yield %8; 227 } 228 ()java.type:"boolean" -> { 229 %9 : java.type:"boolean" = constant @true; 230 yield %9; 231 } 232 ()java.type:"long" -> { 233 %10 : java.type:"int" = constant @0; 234 %11 : java.type:"long" = conv %10; 235 yield %11; 236 }; 237 %12 : Var<java.type:"long"> = var %4 @"l"; 238 return; 239 }; 240 """) 241 void test10(int i) { 242 long l = switch (i) { 243 case 1 -> 1L; 244 default -> 0; 245 }; 246 } 247 248 @CodeReflection 249 @IR(""" 250 func @"test11" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 251 %2 : Var<java.type:"int"> = var %1 @"i"; 252 %3 : java.type:"int" = var.load %2; 253 %4 : java.type:"long" = java.switch.expression %3 254 (%5 : java.type:"int")java.type:"boolean" -> { 255 %6 : java.type:"int" = constant @1; 256 %7 : java.type:"boolean" = eq %5 %6; 257 yield %7; 258 } 259 ()java.type:"long" -> { 260 %8 : java.type:"int" = constant @1; 261 %9 : java.type:"long" = conv %8; 262 yield %9; 263 } 264 ()java.type:"boolean" -> { 265 %10 : java.type:"boolean" = constant @true; 266 yield %10; 267 } 268 ()java.type:"long" -> { 269 %11 : java.type:"long" = constant @0; 270 yield %11; 271 }; 272 %12 : Var<java.type:"long"> = var %4 @"l"; 273 return; 274 }; 275 """) 276 void test11(int i) { 277 long l = switch (i) { 278 case 1 -> 1; 279 default -> 0L; 280 }; 281 } 282 283 @CodeReflection 284 @IR(""" 285 func @"test12" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 286 %2 : Var<java.type:"int"> = var %1 @"i"; 287 %3 : java.type:"int" = var.load %2; 288 %4 : java.type:"long" = java.switch.expression %3 289 (%5 : java.type:"int")java.type:"boolean" -> { 290 %6 : java.type:"int" = constant @1; 291 %7 : java.type:"boolean" = eq %5 %6; 292 yield %7; 293 } 294 ()java.type:"long" -> { 295 %8 : java.type:"int" = constant @1; 296 %9 : java.type:"long" = conv %8; 297 yield %9; 298 } 299 ()java.type:"boolean" -> { 300 %10 : java.type:"boolean" = constant @true; 301 yield %10; 302 } 303 ()java.type:"long" -> { 304 %11 : java.type:"int" = constant @0; 305 %12 : java.type:"long" = conv %11; 306 yield %12; 307 }; 308 %13 : Var<java.type:"long"> = var %4 @"l"; 309 return; 310 }; 311 """) 312 void test12(int i) { 313 long l = switch (i) { 314 case 1 -> 1; 315 default -> 0; 316 }; 317 } 318 319 @CodeReflection 320 @IR(""" 321 func @"test13" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 322 %2 : Var<java.type:"int"> = var %1 @"i"; 323 %3 : java.type:"int" = var.load %2; 324 %4 : java.type:"long" = java.switch.expression %3 325 (%5 : java.type:"int")java.type:"boolean" -> { 326 %6 : java.type:"int" = constant @1; 327 %7 : java.type:"boolean" = eq %5 %6; 328 yield %7; 329 } 330 ()java.type:"long" -> { 331 %8 : java.type:"long" = constant @1; 332 java.yield %8; 333 } 334 ()java.type:"boolean" -> { 335 %9 : java.type:"boolean" = constant @true; 336 yield %9; 337 } 338 ()java.type:"long" -> { 339 %10 : java.type:"int" = constant @0; 340 %11 : java.type:"long" = conv %10; 341 java.yield %11; 342 }; 343 %12 : Var<java.type:"long"> = var %4 @"l"; 344 return; 345 }; 346 """) 347 void test13(int i) { 348 long l = switch (i) { 349 case 1 -> { yield 1L; } 350 default -> { yield 0; } 351 }; 352 } 353 354 @CodeReflection 355 @IR(""" 356 func @"test14" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 357 %2 : Var<java.type:"int"> = var %1 @"i"; 358 %3 : java.type:"int" = var.load %2; 359 %4 : java.type:"long" = java.switch.expression %3 360 (%5 : java.type:"int")java.type:"boolean" -> { 361 %6 : java.type:"int" = constant @1; 362 %7 : java.type:"boolean" = eq %5 %6; 363 yield %7; 364 } 365 ()java.type:"long" -> { 366 %8 : java.type:"int" = constant @1; 367 %9 : java.type:"long" = conv %8; 368 java.yield %9; 369 } 370 ()java.type:"boolean" -> { 371 %10 : java.type:"boolean" = constant @true; 372 yield %10; 373 } 374 ()java.type:"long" -> { 375 %11 : java.type:"long" = constant @0; 376 java.yield %11; 377 }; 378 %12 : Var<java.type:"long"> = var %4 @"l"; 379 return; 380 }; 381 """) 382 void test14(int i) { 383 long l = switch (i) { 384 case 1 -> { yield 1; } 385 default -> { yield 0L; } 386 }; 387 } 388 389 @CodeReflection 390 @IR(""" 391 func @"test15" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 392 %2 : Var<java.type:"int"> = var %1 @"i"; 393 %3 : java.type:"int" = var.load %2; 394 %4 : java.type:"long" = java.switch.expression %3 395 (%5 : java.type:"int")java.type:"boolean" -> { 396 %6 : java.type:"int" = constant @1; 397 %7 : java.type:"boolean" = eq %5 %6; 398 yield %7; 399 } 400 ()java.type:"long" -> { 401 %8 : java.type:"int" = constant @1; 402 %9 : java.type:"long" = conv %8; 403 java.yield %9; 404 } 405 ()java.type:"boolean" -> { 406 %10 : java.type:"boolean" = constant @true; 407 yield %10; 408 } 409 ()java.type:"long" -> { 410 %11 : java.type:"int" = constant @0; 411 %12 : java.type:"long" = conv %11; 412 java.yield %12; 413 }; 414 %13 : Var<java.type:"long"> = var %4 @"l"; 415 return; 416 }; 417 """) 418 void test15(int i) { 419 long l = switch (i) { 420 case 1 -> { yield 1; } 421 default -> { yield 0; } 422 }; 423 } 424 425 @CodeReflection 426 @IR(""" 427 func @"test16" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 428 %2 : Var<java.type:"int"> = var %1 @"i"; 429 %3 : java.type:"int" = var.load %2; 430 %4 : java.type:"long" = conv %3; 431 %5 : java.type:"long" = constant @2; 432 %6 : java.type:"long" = add %4 %5; 433 %7 : Var<java.type:"long"> = var %6 @"l"; 434 return; 435 }; 436 """) 437 void test16(int i) { 438 long l = i + 2L; 439 } 440 441 void m(long l) { } 442 443 @CodeReflection 444 @IR(""" 445 func @"test17" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 446 %2 : Var<java.type:"int"> = var %1 @"i"; 447 %3 : java.type:"int" = var.load %2; 448 %4 : java.type:"long" = conv %3; 449 invoke %0 %4 @java.ref:"ImplicitConversionTest::m(long):void"; 450 return; 451 }; 452 """) 453 void test17(int i) { 454 m(i); 455 } 456 457 void m(int i1, int i2, long... l) { } 458 459 @CodeReflection 460 @IR(""" 461 func @"test18" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 462 %2 : Var<java.type:"int"> = var %1 @"i"; 463 %3 : java.type:"int" = var.load %2; 464 %4 : java.type:"int" = var.load %2; 465 invoke %0 %3 %4 @java.ref:"ImplicitConversionTest::m(int, int, long[]):void" @invoke.kind="INSTANCE" @invoke.varargs=true; 466 return; 467 }; 468 """) 469 void test18(int i) { 470 m(i, i); 471 } 472 473 @CodeReflection 474 @IR(""" 475 func @"test19" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 476 %2 : Var<java.type:"int"> = var %1 @"i"; 477 %3 : java.type:"int" = var.load %2; 478 %4 : java.type:"int" = var.load %2; 479 %5 : java.type:"int" = var.load %2; 480 %6 : java.type:"long" = conv %5; 481 invoke %0 %3 %4 %6 @java.ref:"ImplicitConversionTest::m(int, int, long[]):void" @invoke.kind="INSTANCE" @invoke.varargs=true; 482 return; 483 }; 484 """) 485 void test19(int i) { 486 m(i, i, i); 487 } 488 489 @CodeReflection 490 @IR(""" 491 func @"test20" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 492 %2 : Var<java.type:"int"> = var %1 @"i"; 493 %3 : java.type:"int" = var.load %2; 494 %4 : java.type:"int" = var.load %2; 495 %5 : java.type:"int" = var.load %2; 496 %6 : java.type:"long" = conv %5; 497 %7 : java.type:"int" = var.load %2; 498 %8 : java.type:"long" = conv %7; 499 invoke %0 %3 %4 %6 %8 @java.ref:"ImplicitConversionTest::m(int, int, long[]):void" @invoke.kind="INSTANCE" @invoke.varargs=true; 500 return; 501 }; 502 """) 503 void test20(int i) { 504 m(i, i, i, i); 505 } 506 507 static class Box { 508 Box(long l) { } 509 Box(int i1, int i2, long... longs) { } 510 } 511 512 @CodeReflection 513 @IR(""" 514 func @"test21" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 515 %2 : Var<java.type:"int"> = var %1 @"i"; 516 %3 : java.type:"int" = var.load %2; 517 %4 : java.type:"long" = conv %3; 518 %5 : java.type:"ImplicitConversionTest$Box" = new %4 @java.ref:"ImplicitConversionTest$Box::(long)"; 519 return; 520 }; 521 """) 522 void test21(int i) { 523 new Box(i); 524 } 525 526 @CodeReflection 527 @IR(""" 528 func @"test22" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 529 %2 : Var<java.type:"int"> = var %1 @"i"; 530 %3 : java.type:"int" = var.load %2; 531 %4 : java.type:"int" = var.load %2; 532 %5 : java.type:"ImplicitConversionTest$Box" = new %3 %4 @java.ref:"ImplicitConversionTest$Box::(int, int, long[])" @new.varargs=true; 533 return; 534 }; 535 """) 536 void test22(int i) { 537 new Box(i, i); 538 } 539 540 @CodeReflection 541 @IR(""" 542 func @"test23" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 543 %2 : Var<java.type:"int"> = var %1 @"i"; 544 %3 : java.type:"int" = var.load %2; 545 %4 : java.type:"int" = var.load %2; 546 %5 : java.type:"int" = var.load %2; 547 %6 : java.type:"long" = conv %5; 548 %7 : java.type:"ImplicitConversionTest$Box" = new %3 %4 %6 @java.ref:"ImplicitConversionTest$Box::(int, int, long[])" @new.varargs=true; 549 return; 550 }; 551 """) 552 void test23(int i) { 553 new Box(i, i, i); 554 } 555 556 @CodeReflection 557 @IR(""" 558 func @"test24" (%0 : java.type:"ImplicitConversionTest", %1 : java.type:"int")java.type:"void" -> { 559 %2 : Var<java.type:"int"> = var %1 @"i"; 560 %3 : java.type:"int" = var.load %2; 561 %4 : java.type:"int" = var.load %2; 562 %5 : java.type:"int" = var.load %2; 563 %6 : java.type:"long" = conv %5; 564 %7 : java.type:"int" = var.load %2; 565 %8 : java.type:"long" = conv %7; 566 %9 : java.type:"ImplicitConversionTest$Box" = new %3 %4 %6 %8 @java.ref:"ImplicitConversionTest$Box::(int, int, long[])" @new.varargs=true; 567 return; 568 }; 569 """) 570 void test24(int i) { 571 new Box(i, i, i, i); 572 } 573 }