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