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