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 }