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 }