1 /*
2 * Copyright (c) 2024, 2026, 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 import java.util.Collection;
26 import java.util.RandomAccess;
27 import java.util.Stack;
28
29 /*
30 * @test
31 * @modules jdk.incubator.code
32 * @build SwitchStatementTest
33 * @build CodeReflectionTester
34 * @run main CodeReflectionTester SwitchStatementTest
35 */
36 public class SwitchStatementTest {
37
38 @IR("""
39 func @"caseConstantRuleExpression" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
40 %1 : Var<java.type:"java.lang.String"> = var %0 @"r";
41 %2 : java.type:"java.lang.String" = constant @"";
42 %3 : Var<java.type:"java.lang.String"> = var %2 @"s";
43 %4 : java.type:"java.lang.String" = var.load %1;
44 java.switch.statement %4
45 (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
46 %6 : java.type:"java.lang.String" = constant @"FOO";
47 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
48 yield %7;
49 }
50 ()java.type:"void" -> {
51 %8 : java.type:"java.lang.String" = var.load %3;
52 %9 : java.type:"java.lang.String" = constant @"BAR";
53 %10 : java.type:"java.lang.String" = concat %8 %9;
54 var.store %3 %10;
55 yield;
56 }
57 (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
58 %12 : java.type:"java.lang.String" = constant @"BAR";
59 %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
60 yield %13;
61 }
62 ()java.type:"void" -> {
63 %14 : java.type:"java.lang.String" = var.load %3;
64 %15 : java.type:"java.lang.String" = constant @"BAZ";
65 %16 : java.type:"java.lang.String" = concat %14 %15;
66 var.store %3 %16;
67 yield;
68 }
69 (%17 : java.type:"java.lang.String")java.type:"boolean" -> {
70 %18 : java.type:"java.lang.String" = constant @"BAZ";
71 %19 : java.type:"boolean" = invoke %17 %18 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
72 yield %19;
73 }
74 ()java.type:"void" -> {
75 %20 : java.type:"java.lang.String" = var.load %3;
76 %21 : java.type:"java.lang.String" = constant @"FOO";
77 %22 : java.type:"java.lang.String" = concat %20 %21;
78 var.store %3 %22;
79 yield;
80 }
81 ()java.type:"boolean" -> {
82 %23 : java.type:"boolean" = constant @true;
83 yield %23;
84 }
85 ()java.type:"void" -> {
86 %24 : java.type:"java.lang.String" = var.load %3;
87 %25 : java.type:"java.lang.String" = constant @"else";
88 %26 : java.type:"java.lang.String" = concat %24 %25;
89 var.store %3 %26;
90 yield;
91 };
92 %27 : java.type:"java.lang.String" = var.load %3;
93 return %27;
94 };
95 """)
96 @Reflect
97 public static String caseConstantRuleExpression(String r) {
98 String s = "";
99 switch (r) {
100 case "FOO" -> s += "BAR";
101 case "BAR" -> s += "BAZ";
102 case "BAZ" -> s += "FOO";
103 default -> s += "else";
104 }
105 return s;
106 }
107
108 @IR("""
109 func @"caseConstantRuleBlock" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
110 %1 : Var<java.type:"java.lang.String"> = var %0 @"r";
111 %2 : java.type:"java.lang.String" = constant @"";
112 %3 : Var<java.type:"java.lang.String"> = var %2 @"s";
113 %4 : java.type:"java.lang.String" = var.load %1;
114 java.switch.statement %4
115 (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
116 %6 : java.type:"java.lang.String" = constant @"FOO";
117 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
118 yield %7;
119 }
120 ()java.type:"void" -> {
121 %8 : java.type:"java.lang.String" = var.load %3;
122 %9 : java.type:"java.lang.String" = constant @"BAR";
123 %10 : java.type:"java.lang.String" = concat %8 %9;
124 var.store %3 %10;
125 yield;
126 }
127 (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
128 %12 : java.type:"java.lang.String" = constant @"BAR";
129 %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
130 yield %13;
131 }
132 ()java.type:"void" -> {
133 %14 : java.type:"java.lang.String" = var.load %3;
134 %15 : java.type:"java.lang.String" = constant @"BAZ";
135 %16 : java.type:"java.lang.String" = concat %14 %15;
136 var.store %3 %16;
137 yield;
138 }
139 (%17 : java.type:"java.lang.String")java.type:"boolean" -> {
140 %18 : java.type:"java.lang.String" = constant @"BAZ";
141 %19 : java.type:"boolean" = invoke %17 %18 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
142 yield %19;
143 }
144 ()java.type:"void" -> {
145 %20 : java.type:"java.lang.String" = var.load %3;
146 %21 : java.type:"java.lang.String" = constant @"FOO";
147 %22 : java.type:"java.lang.String" = concat %20 %21;
148 var.store %3 %22;
149 yield;
150 }
151 ()java.type:"boolean" -> {
152 %23 : java.type:"boolean" = constant @true;
153 yield %23;
154 }
155 ()java.type:"void" -> {
156 %24 : java.type:"java.lang.String" = var.load %3;
157 %25 : java.type:"java.lang.String" = constant @"else";
158 %26 : java.type:"java.lang.String" = concat %24 %25;
159 var.store %3 %26;
160 yield;
161 };
162 %27 : java.type:"java.lang.String" = var.load %3;
163 return %27;
164 };
165 """)
166 @Reflect
167 public static String caseConstantRuleBlock(String r) {
168 String s = "";
169 switch (r) {
170 case "FOO" -> {
171 s += "BAR";
172 }
173 case "BAR" -> {
174 s += "BAZ";
175 }
176 case "BAZ" -> {
177 s += "FOO";
178 }
179 default -> {
180 s += "else";
181 }
182 }
183 return s;
184 }
185
186 @IR("""
187 func @"caseConstantStatement" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
188 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
189 %2 : java.type:"java.lang.String" = constant @"";
190 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
191 %4 : java.type:"java.lang.String" = var.load %1;
192 java.switch.statement %4
193 (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
194 %6 : java.type:"java.lang.String" = constant @"FOO";
195 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
196 yield %7;
197 }
198 ()java.type:"void" -> {
199 %8 : java.type:"java.lang.String" = var.load %3;
200 %9 : java.type:"java.lang.String" = constant @"BAR";
201 %10 : java.type:"java.lang.String" = concat %8 %9;
202 var.store %3 %10;
203 java.break;
204 }
205 (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
206 %12 : java.type:"java.lang.String" = constant @"BAR";
207 %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
208 yield %13;
209 }
210 ()java.type:"void" -> {
211 %14 : java.type:"java.lang.String" = var.load %3;
212 %15 : java.type:"java.lang.String" = constant @"BAZ";
213 %16 : java.type:"java.lang.String" = concat %14 %15;
214 var.store %3 %16;
215 java.break;
216 }
217 (%17 : java.type:"java.lang.String")java.type:"boolean" -> {
218 %18 : java.type:"java.lang.String" = constant @"BAZ";
219 %19 : java.type:"boolean" = invoke %17 %18 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
220 yield %19;
221 }
222 ()java.type:"void" -> {
223 %20 : java.type:"java.lang.String" = var.load %3;
224 %21 : java.type:"java.lang.String" = constant @"FOO";
225 %22 : java.type:"java.lang.String" = concat %20 %21;
226 var.store %3 %22;
227 java.break;
228 }
229 ()java.type:"boolean" -> {
230 %23 : java.type:"boolean" = constant @true;
231 yield %23;
232 }
233 ()java.type:"void" -> {
234 %24 : java.type:"java.lang.String" = var.load %3;
235 %25 : java.type:"java.lang.String" = constant @"else";
236 %26 : java.type:"java.lang.String" = concat %24 %25;
237 var.store %3 %26;
238 yield;
239 };
240 %27 : java.type:"java.lang.String" = var.load %3;
241 return %27;
242 };
243 """)
244 @Reflect
245 private static String caseConstantStatement(String s) {
246 String r = "";
247 switch (s) {
248 case "FOO":
249 r += "BAR";
250 break;
251 case "BAR":
252 r += "BAZ";
253 break;
254 case "BAZ":
255 r += "FOO";
256 break;
257 default:
258 r += "else";
259 }
260 return r;
261 }
262
263 @IR("""
264 func @"caseConstantMultiLabels" (%0 : java.type:"char")java.type:"java.lang.String" -> {
265 %1 : Var<java.type:"char"> = var %0 @"c";
266 %2 : java.type:"java.lang.String" = constant @"";
267 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
268 %4 : java.type:"char" = var.load %1;
269 %5 : java.type:"char" = invoke %4 @java.ref:"java.lang.Character::toLowerCase(char):char";
270 java.switch.statement %5
271 (%6 : java.type:"char")java.type:"boolean" -> {
272 %7 : java.type:"boolean" = java.cor
273 ()java.type:"boolean" -> {
274 %8 : java.type:"char" = constant @'a';
275 %9 : java.type:"boolean" = eq %6 %8;
276 yield %9;
277 }
278 ()java.type:"boolean" -> {
279 %10 : java.type:"char" = constant @'e';
280 %11 : java.type:"boolean" = eq %6 %10;
281 yield %11;
282 }
283 ()java.type:"boolean" -> {
284 %12 : java.type:"char" = constant @'i';
285 %13 : java.type:"boolean" = eq %6 %12;
286 yield %13;
287 }
288 ()java.type:"boolean" -> {
289 %14 : java.type:"char" = constant @'o';
290 %15 : java.type:"boolean" = eq %6 %14;
291 yield %15;
292 }
293 ()java.type:"boolean" -> {
294 %16 : java.type:"char" = constant @'u';
295 %17 : java.type:"boolean" = eq %6 %16;
296 yield %17;
297 };
298 yield %7;
299 }
300 ()java.type:"void" -> {
301 %18 : java.type:"java.lang.String" = var.load %3;
302 %19 : java.type:"java.lang.String" = constant @"vowel";
303 %20 : java.type:"java.lang.String" = concat %18 %19;
304 var.store %3 %20;
305 java.break;
306 }
307 ()java.type:"boolean" -> {
308 %21 : java.type:"boolean" = constant @true;
309 yield %21;
310 }
311 ()java.type:"void" -> {
312 %22 : java.type:"java.lang.String" = var.load %3;
313 %23 : java.type:"java.lang.String" = constant @"consonant";
314 %24 : java.type:"java.lang.String" = concat %22 %23;
315 var.store %3 %24;
316 yield;
317 };
318 %25 : java.type:"java.lang.String" = var.load %3;
319 return %25;
320 };
321 """)
322 @Reflect
323 private static String caseConstantMultiLabels(char c) {
324 String r = "";
325 switch (Character.toLowerCase(c)) {
326 case 'a', 'e', 'i', 'o', 'u':
327 r += "vowel";
328 break;
329 default:
330 r += "consonant";
331 }
332 return r;
333 }
334
335 @IR("""
336 func @"caseConstantThrow" (%0 : java.type:"java.lang.Integer")java.type:"java.lang.String" -> {
337 %1 : Var<java.type:"java.lang.Integer"> = var %0 @"i";
338 %2 : java.type:"java.lang.String" = constant @"";
339 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
340 %4 : java.type:"java.lang.Integer" = var.load %1;
341 java.switch.statement %4
342 (%5 : java.type:"java.lang.Integer")java.type:"boolean" -> {
343 %6 : java.type:"int" = invoke %5 @java.ref:"java.lang.Integer::intValue():int";
344 %7 : java.type:"int" = constant @8;
345 %8 : java.type:"boolean" = eq %6 %7;
346 yield %8;
347 }
348 ()java.type:"void" -> {
349 %9 : java.type:"java.lang.IllegalArgumentException" = new @java.ref:"java.lang.IllegalArgumentException::()";
350 throw %9;
351 }
352 (%10 : java.type:"java.lang.Integer")java.type:"boolean" -> {
353 %11 : java.type:"int" = invoke %10 @java.ref:"java.lang.Integer::intValue():int";
354 %12 : java.type:"int" = constant @9;
355 %13 : java.type:"boolean" = eq %11 %12;
356 yield %13;
357 }
358 ()java.type:"void" -> {
359 %14 : java.type:"java.lang.String" = var.load %3;
360 %15 : java.type:"java.lang.String" = constant @"Nine";
361 %16 : java.type:"java.lang.String" = concat %14 %15;
362 var.store %3 %16;
363 yield;
364 }
365 ()java.type:"boolean" -> {
366 %17 : java.type:"boolean" = constant @true;
367 yield %17;
368 }
369 ()java.type:"void" -> {
370 %18 : java.type:"java.lang.String" = var.load %3;
371 %19 : java.type:"java.lang.String" = constant @"An integer";
372 %20 : java.type:"java.lang.String" = concat %18 %19;
373 var.store %3 %20;
374 yield;
375 };
376 %21 : java.type:"java.lang.String" = var.load %3;
377 return %21;
378 };
379 """)
380 @Reflect
381 private static String caseConstantThrow(Integer i) {
382 String r = "";
383 switch (i) {
384 case 8 -> throw new IllegalArgumentException();
385 case 9 -> r += "Nine";
386 default -> r += "An integer";
387 }
388 return r;
389 }
390
391 @IR("""
392 func @"caseConstantNullLabel" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
393 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
394 %2 : java.type:"java.lang.String" = constant @"";
395 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
396 %4 : java.type:"java.lang.String" = var.load %1;
397 java.switch.statement %4 @switch.handle.nulls=true
398 (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
399 %6 : java.type:"java.lang.Object" = constant @null;
400 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
401 yield %7;
402 }
403 ()java.type:"void" -> {
404 %8 : java.type:"java.lang.String" = var.load %3;
405 %9 : java.type:"java.lang.String" = constant @"null";
406 %10 : java.type:"java.lang.String" = concat %8 %9;
407 var.store %3 %10;
408 yield;
409 }
410 ()java.type:"boolean" -> {
411 %11 : java.type:"boolean" = constant @true;
412 yield %11;
413 }
414 ()java.type:"void" -> {
415 %12 : java.type:"java.lang.String" = var.load %3;
416 %13 : java.type:"java.lang.String" = constant @"non null";
417 %14 : java.type:"java.lang.String" = concat %12 %13;
418 var.store %3 %14;
419 yield;
420 };
421 %15 : java.type:"java.lang.String" = var.load %3;
422 return %15;
423 };
424 """)
425 @Reflect
426 private static String caseConstantNullLabel(String s) {
427 String r = "";
428 switch (s) {
429 case null -> r += "null";
430 default -> r += "non null";
431 }
432 return r;
433 }
434
435 @IR("""
436 func @"caseConstantNullAndDefault" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
437 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
438 %2 : java.type:"java.lang.String" = constant @"";
439 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
440 %4 : java.type:"java.lang.String" = var.load %1;
441 java.switch.statement %4 @switch.handle.nulls=true
442 (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
443 %6 : java.type:"java.lang.String" = constant @"abc";
444 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
445 yield %7;
446 }
447 ()java.type:"void" -> {
448 %8 : java.type:"java.lang.String" = var.load %3;
449 %9 : java.type:"java.lang.String" = constant @"alphabet";
450 %10 : java.type:"java.lang.String" = concat %8 %9;
451 var.store %3 %10;
452 yield;
453 }
454 ()java.type:"boolean" -> {
455 %11 : java.type:"boolean" = constant @true;
456 yield %11;
457 }
458 ()java.type:"void" -> {
459 %12 : java.type:"java.lang.String" = var.load %3;
460 %13 : java.type:"java.lang.String" = constant @"null or default";
461 %14 : java.type:"java.lang.String" = concat %12 %13;
462 var.store %3 %14;
463 yield;
464 };
465 %15 : java.type:"java.lang.String" = var.load %3;
466 return %15;
467 };
468 """)
469 @Reflect
470 private static String caseConstantNullAndDefault(String s) {
471 String r = "";
472 switch (s) {
473 case "abc" -> r += "alphabet";
474 case null, default -> r += "null or default";
475 }
476 return r;
477 }
478
479 @IR("""
480 func @"caseConstantFallThrough" (%0 : java.type:"char")java.type:"java.lang.String" -> {
481 %1 : Var<java.type:"char"> = var %0 @"c";
482 %2 : java.type:"java.lang.String" = constant @"";
483 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
484 %4 : java.type:"char" = var.load %1;
485 java.switch.statement %4
486 (%5 : java.type:"char")java.type:"boolean" -> {
487 %6 : java.type:"char" = constant @'A';
488 %7 : java.type:"boolean" = eq %5 %6;
489 yield %7;
490 }
491 ()java.type:"void" -> {
492 java.switch.fallthrough;
493 }
494 (%8 : java.type:"char")java.type:"boolean" -> {
495 %9 : java.type:"char" = constant @'B';
496 %10 : java.type:"boolean" = eq %8 %9;
497 yield %10;
498 }
499 ()java.type:"void" -> {
500 %11 : java.type:"java.lang.String" = var.load %3;
501 %12 : java.type:"java.lang.String" = constant @"A or B";
502 %13 : java.type:"java.lang.String" = concat %11 %12;
503 var.store %3 %13;
504 java.break;
505 }
506 ()java.type:"boolean" -> {
507 %14 : java.type:"boolean" = constant @true;
508 yield %14;
509 }
510 ()java.type:"void" -> {
511 %15 : java.type:"java.lang.String" = var.load %3;
512 %16 : java.type:"java.lang.String" = constant @"Neither A nor B";
513 %17 : java.type:"java.lang.String" = concat %15 %16;
514 var.store %3 %17;
515 yield;
516 };
517 %18 : java.type:"java.lang.String" = var.load %3;
518 return %18;
519 };
520 """)
521 @Reflect
522 private static String caseConstantFallThrough(char c) {
523 String r = "";
524 switch (c) {
525 case 'A':
526 case 'B':
527 r += "A or B";
528 break;
529 default:
530 r += "Neither A nor B";
531 }
532 return r;
533 }
534
535 enum Day {
536 MON, TUE, WED, THU, FRI, SAT, SUN
537 }
538 @IR("""
539 func @"caseConstantEnum" (%0 : java.type:"SwitchStatementTest$Day")java.type:"java.lang.String" -> {
540 %1 : Var<java.type:"SwitchStatementTest$Day"> = var %0 @"d";
541 %2 : java.type:"java.lang.String" = constant @"";
542 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
543 %4 : java.type:"SwitchStatementTest$Day" = var.load %1;
544 java.switch.statement %4
545 (%5 : java.type:"SwitchStatementTest$Day")java.type:"boolean" -> {
546 %6 : java.type:"boolean" = java.cor
547 ()java.type:"boolean" -> {
548 %7 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::MON:SwitchStatementTest$Day";
549 %8 : java.type:"boolean" = eq %5 %7;
550 yield %8;
551 }
552 ()java.type:"boolean" -> {
553 %9 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::FRI:SwitchStatementTest$Day";
554 %10 : java.type:"boolean" = eq %5 %9;
555 yield %10;
556 }
557 ()java.type:"boolean" -> {
558 %11 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::SUN:SwitchStatementTest$Day";
559 %12 : java.type:"boolean" = eq %5 %11;
560 yield %12;
561 };
562 yield %6;
563 }
564 ()java.type:"void" -> {
565 %13 : java.type:"java.lang.String" = var.load %3;
566 %14 : java.type:"int" = constant @6;
567 %15 : java.type:"java.lang.String" = concat %13 %14;
568 var.store %3 %15;
569 yield;
570 }
571 (%16 : java.type:"SwitchStatementTest$Day")java.type:"boolean" -> {
572 %17 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::TUE:SwitchStatementTest$Day";
573 %18 : java.type:"boolean" = eq %16 %17;
574 yield %18;
575 }
576 ()java.type:"void" -> {
577 %19 : java.type:"java.lang.String" = var.load %3;
578 %20 : java.type:"int" = constant @7;
579 %21 : java.type:"java.lang.String" = concat %19 %20;
580 var.store %3 %21;
581 yield;
582 }
583 (%22 : java.type:"SwitchStatementTest$Day")java.type:"boolean" -> {
584 %23 : java.type:"boolean" = java.cor
585 ()java.type:"boolean" -> {
586 %24 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::THU:SwitchStatementTest$Day";
587 %25 : java.type:"boolean" = eq %22 %24;
588 yield %25;
589 }
590 ()java.type:"boolean" -> {
591 %26 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::SAT:SwitchStatementTest$Day";
592 %27 : java.type:"boolean" = eq %22 %26;
593 yield %27;
594 };
595 yield %23;
596 }
597 ()java.type:"void" -> {
598 %28 : java.type:"java.lang.String" = var.load %3;
599 %29 : java.type:"int" = constant @8;
600 %30 : java.type:"java.lang.String" = concat %28 %29;
601 var.store %3 %30;
602 yield;
603 }
604 (%31 : java.type:"SwitchStatementTest$Day")java.type:"boolean" -> {
605 %32 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::WED:SwitchStatementTest$Day";
606 %33 : java.type:"boolean" = eq %31 %32;
607 yield %33;
608 }
609 ()java.type:"void" -> {
610 %34 : java.type:"java.lang.String" = var.load %3;
611 %35 : java.type:"int" = constant @9;
612 %36 : java.type:"java.lang.String" = concat %34 %35;
613 var.store %3 %36;
614 yield;
615 };
616 %37 : java.type:"java.lang.String" = var.load %3;
617 return %37;
618 };
619 """)
620 @Reflect
621 private static String caseConstantEnum(Day d) {
622 String r = "";
623 switch (d) {
624 case MON, FRI, SUN -> r += 6;
625 case TUE -> r += 7;
626 case THU, SAT -> r += 8;
627 case WED -> r += 9;
628 }
629 return r;
630 }
631
632 static class Constants {
633 static final int c1 = 12;
634 }
635 @IR("""
636 func @"caseConstantOtherKindsOfExpr" (%0 : java.type:"int")java.type:"java.lang.String" -> {
637 %1 : Var<java.type:"int"> = var %0 @"i";
638 %2 : java.type:"java.lang.String" = constant @"";
639 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
640 %4 : java.type:"int" = constant @11;
641 %5 : Var<java.type:"int"> = var %4 @"eleven";
642 %6 : java.type:"int" = var.load %1;
643 java.switch.statement %6
644 (%7 : java.type:"int")java.type:"boolean" -> {
645 %8 : java.type:"int" = constant @1;
646 %9 : java.type:"int" = constant @15;
647 %10 : java.type:"int" = and %8 %9;
648 %11 : java.type:"boolean" = eq %7 %10;
649 yield %11;
650 }
651 ()java.type:"void" -> {
652 %12 : java.type:"java.lang.String" = var.load %3;
653 %13 : java.type:"int" = constant @1;
654 %14 : java.type:"java.lang.String" = concat %12 %13;
655 var.store %3 %14;
656 yield;
657 }
658 (%15 : java.type:"int")java.type:"boolean" -> {
659 %16 : java.type:"int" = constant @4;
660 %17 : java.type:"int" = constant @1;
661 %18 : java.type:"int" = ashr %16 %17;
662 %19 : java.type:"boolean" = eq %15 %18;
663 yield %19;
664 }
665 ()java.type:"void" -> {
666 %20 : java.type:"java.lang.String" = var.load %3;
667 %21 : java.type:"java.lang.String" = constant @"2";
668 %22 : java.type:"java.lang.String" = concat %20 %21;
669 var.store %3 %22;
670 yield;
671 }
672 (%23 : java.type:"int")java.type:"boolean" -> {
673 %24 : java.type:"long" = constant @3;
674 %25 : java.type:"int" = conv %24;
675 %26 : java.type:"boolean" = eq %23 %25;
676 yield %26;
677 }
678 ()java.type:"void" -> {
679 %27 : java.type:"java.lang.String" = var.load %3;
680 %28 : java.type:"int" = constant @3;
681 %29 : java.type:"java.lang.String" = concat %27 %28;
682 var.store %3 %29;
683 yield;
684 }
685 (%30 : java.type:"int")java.type:"boolean" -> {
686 %31 : java.type:"int" = constant @2;
687 %32 : java.type:"int" = constant @1;
688 %33 : java.type:"int" = lshl %31 %32;
689 %34 : java.type:"boolean" = eq %30 %33;
690 yield %34;
691 }
692 ()java.type:"void" -> {
693 %35 : java.type:"java.lang.String" = var.load %3;
694 %36 : java.type:"int" = constant @4;
695 %37 : java.type:"java.lang.String" = concat %35 %36;
696 var.store %3 %37;
697 yield;
698 }
699 (%38 : java.type:"int")java.type:"boolean" -> {
700 %39 : java.type:"int" = constant @10;
701 %40 : java.type:"int" = constant @2;
702 %41 : java.type:"int" = div %39 %40;
703 %42 : java.type:"boolean" = eq %38 %41;
704 yield %42;
705 }
706 ()java.type:"void" -> {
707 %43 : java.type:"java.lang.String" = var.load %3;
708 %44 : java.type:"int" = constant @5;
709 %45 : java.type:"java.lang.String" = concat %43 %44;
710 var.store %3 %45;
711 yield;
712 }
713 (%46 : java.type:"int")java.type:"boolean" -> {
714 %47 : java.type:"int" = constant @12;
715 %48 : java.type:"int" = constant @6;
716 %49 : java.type:"int" = sub %47 %48;
717 %50 : java.type:"boolean" = eq %46 %49;
718 yield %50;
719 }
720 ()java.type:"void" -> {
721 %51 : java.type:"java.lang.String" = var.load %3;
722 %52 : java.type:"int" = constant @6;
723 %53 : java.type:"java.lang.String" = concat %51 %52;
724 var.store %3 %53;
725 yield;
726 }
727 (%54 : java.type:"int")java.type:"boolean" -> {
728 %55 : java.type:"int" = constant @3;
729 %56 : java.type:"int" = constant @4;
730 %57 : java.type:"int" = add %55 %56;
731 %58 : java.type:"boolean" = eq %54 %57;
732 yield %58;
733 }
734 ()java.type:"void" -> {
735 %59 : java.type:"java.lang.String" = var.load %3;
736 %60 : java.type:"int" = constant @7;
737 %61 : java.type:"java.lang.String" = concat %59 %60;
738 var.store %3 %61;
739 yield;
740 }
741 (%62 : java.type:"int")java.type:"boolean" -> {
742 %63 : java.type:"int" = constant @2;
743 %64 : java.type:"int" = constant @2;
744 %65 : java.type:"int" = mul %63 %64;
745 %66 : java.type:"int" = constant @2;
746 %67 : java.type:"int" = mul %65 %66;
747 %68 : java.type:"boolean" = eq %62 %67;
748 yield %68;
749 }
750 ()java.type:"void" -> {
751 %69 : java.type:"java.lang.String" = var.load %3;
752 %70 : java.type:"int" = constant @8;
753 %71 : java.type:"java.lang.String" = concat %69 %70;
754 var.store %3 %71;
755 yield;
756 }
757 (%72 : java.type:"int")java.type:"boolean" -> {
758 %73 : java.type:"int" = constant @8;
759 %74 : java.type:"int" = constant @1;
760 %75 : java.type:"int" = or %73 %74;
761 %76 : java.type:"boolean" = eq %72 %75;
762 yield %76;
763 }
764 ()java.type:"void" -> {
765 %77 : java.type:"java.lang.String" = var.load %3;
766 %78 : java.type:"int" = constant @9;
767 %79 : java.type:"java.lang.String" = concat %77 %78;
768 var.store %3 %79;
769 yield;
770 }
771 (%80 : java.type:"int")java.type:"boolean" -> {
772 %81 : java.type:"int" = constant @10;
773 %82 : java.type:"boolean" = eq %80 %81;
774 yield %82;
775 }
776 ()java.type:"void" -> {
777 %83 : java.type:"java.lang.String" = var.load %3;
778 %84 : java.type:"int" = constant @10;
779 %85 : java.type:"java.lang.String" = concat %83 %84;
780 var.store %3 %85;
781 yield;
782 }
783 (%86 : java.type:"int")java.type:"boolean" -> {
784 %87 : java.type:"int" = var.load %5;
785 %88 : java.type:"boolean" = eq %86 %87;
786 yield %88;
787 }
788 ()java.type:"void" -> {
789 %89 : java.type:"java.lang.String" = var.load %3;
790 %90 : java.type:"int" = constant @11;
791 %91 : java.type:"java.lang.String" = concat %89 %90;
792 var.store %3 %91;
793 yield;
794 }
795 (%92 : java.type:"int")java.type:"boolean" -> {
796 %93 : java.type:"int" = field.load @java.ref:"SwitchStatementTest$Constants::c1:int";
797 %94 : java.type:"boolean" = eq %92 %93;
798 yield %94;
799 }
800 ()java.type:"void" -> {
801 %95 : java.type:"java.lang.String" = var.load %3;
802 %96 : java.type:"int" = field.load @java.ref:"SwitchStatementTest$Constants::c1:int";
803 %97 : java.type:"java.lang.String" = concat %95 %96;
804 var.store %3 %97;
805 yield;
806 }
807 (%98 : java.type:"int")java.type:"boolean" -> {
808 %99 : java.type:"int" = java.cexpression
809 ()java.type:"boolean" -> {
810 %100 : java.type:"int" = constant @1;
811 %101 : java.type:"int" = constant @0;
812 %102 : java.type:"boolean" = gt %100 %101;
813 yield %102;
814 }
815 ()java.type:"int" -> {
816 %103 : java.type:"int" = constant @13;
817 yield %103;
818 }
819 ()java.type:"int" -> {
820 %104 : java.type:"int" = constant @133;
821 yield %104;
822 };
823 %105 : java.type:"boolean" = eq %98 %99;
824 yield %105;
825 }
826 ()java.type:"void" -> {
827 %106 : java.type:"java.lang.String" = var.load %3;
828 %107 : java.type:"int" = constant @13;
829 %108 : java.type:"java.lang.String" = concat %106 %107;
830 var.store %3 %108;
831 yield;
832 }
833 ()java.type:"boolean" -> {
834 %109 : java.type:"boolean" = constant @true;
835 yield %109;
836 }
837 ()java.type:"void" -> {
838 %110 : java.type:"java.lang.String" = var.load %3;
839 %111 : java.type:"java.lang.String" = constant @"an int";
840 %112 : java.type:"java.lang.String" = concat %110 %111;
841 var.store %3 %112;
842 yield;
843 };
844 %113 : java.type:"java.lang.String" = var.load %3;
845 return %113;
846 };
847 """)
848 @Reflect
849 private static String caseConstantOtherKindsOfExpr(int i) {
850 String r = "";
851 final int eleven = 11;
852 switch (i) {
853 case 1 & 0xF -> r += 1;
854 case 4>>1 -> r += "2";
855 case (int) 3L -> r += 3;
856 case 2<<1 -> r += 4;
857 case 10 / 2 -> r += 5;
858 case 12 - 6 -> r += 6;
859 case 3 + 4 -> r += 7;
860 case 2 * 2 * 2 -> r += 8;
861 case 8 | 1 -> r += 9;
862 case (10) -> r += 10;
863 case eleven -> r += 11;
864 case Constants.c1 -> r += Constants.c1;
865 case 1 > 0 ? 13 : 133 -> r += 13;
866 default -> r += "an int";
867 }
868 return r;
869 }
870
871 @IR("""
872 func @"caseConstantConv" (%0 : java.type:"short")java.type:"java.lang.String" -> {
873 %1 : Var<java.type:"short"> = var %0 @"a";
874 %2 : java.type:"int" = constant @1;
875 %3 : java.type:"short" = conv %2;
876 %4 : Var<java.type:"short"> = var %3 @"s";
877 %5 : java.type:"int" = constant @2;
878 %6 : java.type:"byte" = conv %5;
879 %7 : Var<java.type:"byte"> = var %6 @"b";
880 %8 : java.type:"java.lang.String" = constant @"";
881 %9 : Var<java.type:"java.lang.String"> = var %8 @"r";
882 %10 : java.type:"short" = var.load %1;
883 java.switch.statement %10
884 (%11 : java.type:"short")java.type:"boolean" -> {
885 %12 : java.type:"short" = var.load %4;
886 %13 : java.type:"boolean" = eq %11 %12;
887 yield %13;
888 }
889 ()java.type:"void" -> {
890 %14 : java.type:"java.lang.String" = var.load %9;
891 %15 : java.type:"java.lang.String" = constant @"one";
892 %16 : java.type:"java.lang.String" = concat %14 %15;
893 var.store %9 %16;
894 yield;
895 }
896 (%17 : java.type:"short")java.type:"boolean" -> {
897 %18 : java.type:"byte" = var.load %7;
898 %19 : java.type:"short" = conv %18;
899 %20 : java.type:"boolean" = eq %17 %19;
900 yield %20;
901 }
902 ()java.type:"void" -> {
903 %21 : java.type:"java.lang.String" = var.load %9;
904 %22 : java.type:"java.lang.String" = constant @"two";
905 %23 : java.type:"java.lang.String" = concat %21 %22;
906 var.store %9 %23;
907 yield;
908 }
909 (%24 : java.type:"short")java.type:"boolean" -> {
910 %25 : java.type:"int" = constant @3;
911 %26 : java.type:"short" = conv %25;
912 %27 : java.type:"boolean" = eq %24 %26;
913 yield %27;
914 }
915 ()java.type:"void" -> {
916 %28 : java.type:"java.lang.String" = var.load %9;
917 %29 : java.type:"java.lang.String" = constant @"three";
918 %30 : java.type:"java.lang.String" = concat %28 %29;
919 var.store %9 %30;
920 yield;
921 }
922 ()java.type:"boolean" -> {
923 %31 : java.type:"boolean" = constant @true;
924 yield %31;
925 }
926 ()java.type:"void" -> {
927 %32 : java.type:"java.lang.String" = var.load %9;
928 %33 : java.type:"java.lang.String" = constant @"else";
929 %34 : java.type:"java.lang.String" = concat %32 %33;
930 var.store %9 %34;
931 yield;
932 };
933 %35 : java.type:"java.lang.String" = var.load %9;
934 return %35;
935 };
936 """)
937 @Reflect
938 static String caseConstantConv(short a) {
939 final short s = 1;
940 final byte b = 2;
941 String r = "";
942 switch (a) {
943 case s -> r += "one"; // identity, short -> short
944 case b -> r += "two"; // widening primitive conversion, byte -> short
945 case 3 -> r += "three"; // narrowing primitive conversion, int -> short
946 default -> r += "else";
947 }
948 return r;
949 }
950
951 @IR("""
952 func @"caseConstantConv2" (%0 : java.type:"java.lang.Byte")java.type:"java.lang.String" -> {
953 %1 : Var<java.type:"java.lang.Byte"> = var %0 @"a";
954 %2 : java.type:"int" = constant @2;
955 %3 : java.type:"byte" = conv %2;
956 %4 : Var<java.type:"byte"> = var %3 @"b";
957 %5 : java.type:"java.lang.String" = constant @"";
958 %6 : Var<java.type:"java.lang.String"> = var %5 @"r";
959 %7 : java.type:"java.lang.Byte" = var.load %1;
960 java.switch.statement %7
961 (%8 : java.type:"java.lang.Byte")java.type:"boolean" -> {
962 %9 : java.type:"byte" = invoke %8 @java.ref:"java.lang.Byte::byteValue():byte";
963 %10 : java.type:"int" = constant @1;
964 %11 : java.type:"byte" = conv %10;
965 %12 : java.type:"boolean" = eq %9 %11;
966 yield %12;
967 }
968 ()java.type:"void" -> {
969 %13 : java.type:"java.lang.String" = var.load %6;
970 %14 : java.type:"java.lang.String" = constant @"one";
971 %15 : java.type:"java.lang.String" = concat %13 %14;
972 var.store %6 %15;
973 yield;
974 }
975 (%16 : java.type:"java.lang.Byte")java.type:"boolean" -> {
976 %17 : java.type:"byte" = invoke %16 @java.ref:"java.lang.Byte::byteValue():byte";
977 %18 : java.type:"byte" = var.load %4;
978 %19 : java.type:"boolean" = eq %17 %18;
979 yield %19;
980 }
981 ()java.type:"void" -> {
982 %20 : java.type:"java.lang.String" = var.load %6;
983 %21 : java.type:"java.lang.String" = constant @"two";
984 %22 : java.type:"java.lang.String" = concat %20 %21;
985 var.store %6 %22;
986 yield;
987 }
988 ()java.type:"boolean" -> {
989 %23 : java.type:"boolean" = constant @true;
990 yield %23;
991 }
992 ()java.type:"void" -> {
993 %24 : java.type:"java.lang.String" = var.load %6;
994 %25 : java.type:"java.lang.String" = constant @"default";
995 %26 : java.type:"java.lang.String" = concat %24 %25;
996 var.store %6 %26;
997 yield;
998 };
999 %27 : java.type:"java.lang.String" = var.load %6;
1000 return %27;
1001 };
1002 """)
1003 @Reflect
1004 static String caseConstantConv2(Byte a) {
1005 final byte b = 2;
1006 String r = "";
1007 switch (a) {
1008 case 1 -> r+= "one";
1009 case b -> r+= "two";
1010 default -> r+= "default";
1011 }
1012 return r;
1013 }
1014
1015 @IR("""
1016 func @"nonEnhancedSwStatNoDefault" (%0 : java.type:"int")java.type:"java.lang.String" -> {
1017 %1 : Var<java.type:"int"> = var %0 @"a";
1018 %2 : java.type:"java.lang.String" = constant @"";
1019 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1020 %4 : java.type:"int" = var.load %1;
1021 java.switch.statement %4
1022 (%5 : java.type:"int")java.type:"boolean" -> {
1023 %6 : java.type:"int" = constant @1;
1024 %7 : java.type:"boolean" = eq %5 %6;
1025 yield %7;
1026 }
1027 ()java.type:"void" -> {
1028 %8 : java.type:"java.lang.String" = var.load %3;
1029 %9 : java.type:"java.lang.String" = constant @"1";
1030 %10 : java.type:"java.lang.String" = concat %8 %9;
1031 var.store %3 %10;
1032 yield;
1033 }
1034 (%11 : java.type:"int")java.type:"boolean" -> {
1035 %12 : java.type:"int" = constant @2;
1036 %13 : java.type:"boolean" = eq %11 %12;
1037 yield %13;
1038 }
1039 ()java.type:"void" -> {
1040 %14 : java.type:"java.lang.String" = var.load %3;
1041 %15 : java.type:"int" = constant @2;
1042 %16 : java.type:"java.lang.String" = concat %14 %15;
1043 var.store %3 %16;
1044 yield;
1045 };
1046 %17 : java.type:"java.lang.String" = var.load %3;
1047 return %17;
1048 };
1049 """)
1050 @Reflect
1051 static String nonEnhancedSwStatNoDefault(int a) {
1052 String r = "";
1053 switch (a) {
1054 case 1 -> r += "1";
1055 case 2 -> r += 2;
1056 }
1057 return r;
1058 }
1059
1060 enum E {A, B}
1061 @IR("""
1062 func @"enhancedSwStatNoDefault1" (%0 : java.type:"SwitchStatementTest$E")java.type:"java.lang.String" -> {
1063 %1 : Var<java.type:"SwitchStatementTest$E"> = var %0 @"e";
1064 %2 : java.type:"java.lang.String" = constant @"";
1065 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1066 %4 : java.type:"SwitchStatementTest$E" = var.load %1;
1067 java.switch.statement %4 @switch.handle.nulls=true
1068 (%5 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1069 %6 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::A:SwitchStatementTest$E";
1070 %7 : java.type:"boolean" = eq %5 %6;
1071 yield %7;
1072 }
1073 ()java.type:"void" -> {
1074 %8 : java.type:"java.lang.String" = var.load %3;
1075 %9 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::A:SwitchStatementTest$E";
1076 %10 : java.type:"java.lang.String" = concat %8 %9;
1077 var.store %3 %10;
1078 yield;
1079 }
1080 (%11 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1081 %12 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::B:SwitchStatementTest$E";
1082 %13 : java.type:"boolean" = eq %11 %12;
1083 yield %13;
1084 }
1085 ()java.type:"void" -> {
1086 %14 : java.type:"java.lang.String" = var.load %3;
1087 %15 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::B:SwitchStatementTest$E";
1088 %16 : java.type:"java.lang.String" = concat %14 %15;
1089 var.store %3 %16;
1090 yield;
1091 }
1092 (%17 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1093 %18 : java.type:"java.lang.Object" = constant @null;
1094 %19 : java.type:"boolean" = eq %17 %18;
1095 yield %19;
1096 }
1097 ()java.type:"void" -> {
1098 %20 : java.type:"java.lang.String" = var.load %3;
1099 %21 : java.type:"java.lang.String" = constant @"null";
1100 %22 : java.type:"java.lang.String" = concat %20 %21;
1101 var.store %3 %22;
1102 yield;
1103 }
1104 ()java.type:"boolean" -> {
1105 %23 : java.type:"boolean" = constant @true;
1106 yield %23;
1107 }
1108 ()java.type:"void" -> {
1109 %24 : java.type:"java.lang.MatchException" = new @java.ref:"java.lang.MatchException::()";
1110 throw %24;
1111 };
1112 %25 : java.type:"java.lang.String" = var.load %3;
1113 return %25;
1114 };
1115 """)
1116 @Reflect
1117 static String enhancedSwStatNoDefault1(E e) {
1118 String r = "";
1119 switch (e) {
1120 case A -> r += E.A;
1121 case B -> r += E.B;
1122 case null -> r += "null";
1123 }
1124 return r;
1125 }
1126
1127 sealed interface I permits K, J {}
1128 record K() implements I {}
1129 static final class J implements I {}
1130 @IR("""
1131 func @"enhancedSwStatNoDefault2" (%0 : java.type:"SwitchStatementTest$I")java.type:"java.lang.String" -> {
1132 %1 : Var<java.type:"SwitchStatementTest$I"> = var %0 @"i";
1133 %2 : java.type:"java.lang.String" = constant @"";
1134 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1135 %4 : java.type:"SwitchStatementTest$I" = var.load %1;
1136 %5 : java.type:"SwitchStatementTest$K" = constant @null;
1137 %6 : Var<java.type:"SwitchStatementTest$K"> = var %5 @"k";
1138 %7 : java.type:"SwitchStatementTest$J" = constant @null;
1139 %8 : Var<java.type:"SwitchStatementTest$J"> = var %7 @"j";
1140 java.switch.statement %4
1141 (%9 : java.type:"SwitchStatementTest$I")java.type:"boolean" -> {
1142 %10 : java.type:"boolean" = pattern.match %9
1143 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$K>" -> {
1144 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$K>" = pattern.type @"k";
1145 yield %11;
1146 }
1147 (%12 : java.type:"SwitchStatementTest$K")java.type:"void" -> {
1148 var.store %6 %12;
1149 yield;
1150 };
1151 yield %10;
1152 }
1153 ()java.type:"void" -> {
1154 %13 : java.type:"java.lang.String" = var.load %3;
1155 %14 : java.type:"java.lang.String" = constant @"K";
1156 %15 : java.type:"java.lang.String" = concat %13 %14;
1157 var.store %3 %15;
1158 yield;
1159 }
1160 (%16 : java.type:"SwitchStatementTest$I")java.type:"boolean" -> {
1161 %17 : java.type:"boolean" = pattern.match %16
1162 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$J>" -> {
1163 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$J>" = pattern.type @"j";
1164 yield %18;
1165 }
1166 (%19 : java.type:"SwitchStatementTest$J")java.type:"void" -> {
1167 var.store %8 %19;
1168 yield;
1169 };
1170 yield %17;
1171 }
1172 ()java.type:"void" -> {
1173 %20 : java.type:"java.lang.String" = var.load %3;
1174 %21 : java.type:"java.lang.String" = constant @"J";
1175 %22 : java.type:"java.lang.String" = concat %20 %21;
1176 var.store %3 %22;
1177 yield;
1178 }
1179 ()java.type:"boolean" -> {
1180 %23 : java.type:"boolean" = constant @true;
1181 yield %23;
1182 }
1183 ()java.type:"void" -> {
1184 %24 : java.type:"java.lang.MatchException" = new @java.ref:"java.lang.MatchException::()";
1185 throw %24;
1186 };
1187 %25 : java.type:"java.lang.String" = var.load %3;
1188 return %25;
1189 };
1190 """)
1191 @Reflect
1192 static String enhancedSwStatNoDefault2(I i) {
1193 String r = "";
1194 switch (i) {
1195 case K k -> r += "K";
1196 case J j -> r += "J";
1197 }
1198 return r;
1199 }
1200
1201 @IR("""
1202 func @"enhancedSwStatUnconditionalPattern" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
1203 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
1204 %2 : java.type:"java.lang.String" = constant @"";
1205 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1206 %4 : java.type:"java.lang.String" = var.load %1;
1207 %5 : java.type:"java.lang.Object" = constant @null;
1208 %6 : Var<java.type:"java.lang.Object"> = var %5 @"o";
1209 java.switch.statement %4
1210 (%7 : java.type:"java.lang.String")java.type:"boolean" -> {
1211 %8 : java.type:"java.lang.String" = constant @"A";
1212 %9 : java.type:"boolean" = invoke %7 %8 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1213 yield %9;
1214 }
1215 ()java.type:"void" -> {
1216 %10 : java.type:"java.lang.String" = var.load %3;
1217 %11 : java.type:"java.lang.String" = constant @"A";
1218 %12 : java.type:"java.lang.String" = concat %10 %11;
1219 var.store %3 %12;
1220 yield;
1221 }
1222 (%13 : java.type:"java.lang.String")java.type:"boolean" -> {
1223 %14 : java.type:"boolean" = pattern.match %13
1224 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Object>" -> {
1225 %15 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Object>" = pattern.type @"o";
1226 yield %15;
1227 }
1228 (%16 : java.type:"java.lang.Object")java.type:"void" -> {
1229 var.store %6 %16;
1230 yield;
1231 };
1232 yield %14;
1233 }
1234 ()java.type:"void" -> {
1235 %17 : java.type:"java.lang.String" = var.load %3;
1236 %18 : java.type:"java.lang.String" = constant @"obj";
1237 %19 : java.type:"java.lang.String" = concat %17 %18;
1238 var.store %3 %19;
1239 yield;
1240 };
1241 %20 : java.type:"java.lang.String" = var.load %3;
1242 return %20;
1243 };
1244 """)
1245 @Reflect
1246 static String enhancedSwStatUnconditionalPattern(String s) {
1247 String r = "";
1248 switch (s) {
1249 case "A" -> r += "A";
1250 case Object o -> r += "obj";
1251 }
1252 return r;
1253 }
1254
1255 @IR("""
1256 func @"casePatternRuleExpression" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1257 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1258 %2 : java.type:"java.lang.String" = constant @"";
1259 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1260 %4 : java.type:"java.lang.Object" = var.load %1;
1261 %5 : java.type:"java.lang.Integer" = constant @null;
1262 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1263 %7 : java.type:"java.lang.String" = constant @null;
1264 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1265 java.switch.statement %4
1266 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1267 %10 : java.type:"boolean" = pattern.match %9
1268 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1269 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1270 yield %11;
1271 }
1272 (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1273 var.store %6 %12;
1274 yield;
1275 };
1276 yield %10;
1277 }
1278 ()java.type:"void" -> {
1279 %13 : java.type:"java.lang.String" = var.load %3;
1280 %14 : java.type:"java.lang.String" = constant @"integer";
1281 %15 : java.type:"java.lang.String" = concat %13 %14;
1282 var.store %3 %15;
1283 yield;
1284 }
1285 (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1286 %17 : java.type:"boolean" = pattern.match %16
1287 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1288 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1289 yield %18;
1290 }
1291 (%19 : java.type:"java.lang.String")java.type:"void" -> {
1292 var.store %8 %19;
1293 yield;
1294 };
1295 yield %17;
1296 }
1297 ()java.type:"void" -> {
1298 %20 : java.type:"java.lang.String" = var.load %3;
1299 %21 : java.type:"java.lang.String" = constant @"string";
1300 %22 : java.type:"java.lang.String" = concat %20 %21;
1301 var.store %3 %22;
1302 yield;
1303 }
1304 ()java.type:"boolean" -> {
1305 %23 : java.type:"boolean" = constant @true;
1306 yield %23;
1307 }
1308 ()java.type:"void" -> {
1309 %24 : java.type:"java.lang.String" = var.load %3;
1310 %25 : java.type:"java.lang.String" = constant @"else";
1311 %26 : java.type:"java.lang.String" = concat %24 %25;
1312 var.store %3 %26;
1313 yield;
1314 };
1315 %27 : java.type:"java.lang.String" = var.load %3;
1316 return %27;
1317 };
1318 """)
1319 @Reflect
1320 private static String casePatternRuleExpression(Object o) {
1321 String r = "";
1322 switch (o) {
1323 case Integer i -> r += "integer";
1324 case String s -> r+= "string";
1325 default -> r+= "else";
1326 }
1327 return r;
1328 }
1329
1330 @IR("""
1331 func @"casePatternRuleBlock" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1332 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1333 %2 : java.type:"java.lang.String" = constant @"";
1334 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1335 %4 : java.type:"java.lang.Object" = var.load %1;
1336 %5 : java.type:"java.lang.Integer" = constant @null;
1337 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1338 %7 : java.type:"java.lang.String" = constant @null;
1339 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1340 java.switch.statement %4
1341 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1342 %10 : java.type:"boolean" = pattern.match %9
1343 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1344 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1345 yield %11;
1346 }
1347 (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1348 var.store %6 %12;
1349 yield;
1350 };
1351 yield %10;
1352 }
1353 ()java.type:"void" -> {
1354 %13 : java.type:"java.lang.String" = var.load %3;
1355 %14 : java.type:"java.lang.String" = constant @"integer";
1356 %15 : java.type:"java.lang.String" = concat %13 %14;
1357 var.store %3 %15;
1358 yield;
1359 }
1360 (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1361 %17 : java.type:"boolean" = pattern.match %16
1362 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1363 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1364 yield %18;
1365 }
1366 (%19 : java.type:"java.lang.String")java.type:"void" -> {
1367 var.store %8 %19;
1368 yield;
1369 };
1370 yield %17;
1371 }
1372 ()java.type:"void" -> {
1373 %20 : java.type:"java.lang.String" = var.load %3;
1374 %21 : java.type:"java.lang.String" = constant @"string";
1375 %22 : java.type:"java.lang.String" = concat %20 %21;
1376 var.store %3 %22;
1377 yield;
1378 }
1379 ()java.type:"boolean" -> {
1380 %23 : java.type:"boolean" = constant @true;
1381 yield %23;
1382 }
1383 ()java.type:"void" -> {
1384 %24 : java.type:"java.lang.String" = var.load %3;
1385 %25 : java.type:"java.lang.String" = constant @"else";
1386 %26 : java.type:"java.lang.String" = concat %24 %25;
1387 var.store %3 %26;
1388 yield;
1389 };
1390 %27 : java.type:"java.lang.String" = var.load %3;
1391 return %27;
1392 };
1393 """)
1394 @Reflect
1395 private static String casePatternRuleBlock(Object o) {
1396 String r = "";
1397 switch (o) {
1398 case Integer i -> {
1399 r += "integer";
1400 }
1401 case String s -> {
1402 r += "string";
1403 }
1404 default -> {
1405 r += "else";
1406 }
1407 }
1408 return r;
1409 }
1410
1411 @IR("""
1412 func @"casePatternStatement" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1413 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1414 %2 : java.type:"java.lang.String" = constant @"";
1415 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1416 %4 : java.type:"java.lang.Object" = var.load %1;
1417 %5 : java.type:"java.lang.Integer" = constant @null;
1418 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1419 %7 : java.type:"java.lang.String" = constant @null;
1420 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1421 java.switch.statement %4
1422 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1423 %10 : java.type:"boolean" = pattern.match %9
1424 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1425 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1426 yield %11;
1427 }
1428 (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1429 var.store %6 %12;
1430 yield;
1431 };
1432 yield %10;
1433 }
1434 ()java.type:"void" -> {
1435 %13 : java.type:"java.lang.String" = var.load %3;
1436 %14 : java.type:"java.lang.String" = constant @"integer";
1437 %15 : java.type:"java.lang.String" = concat %13 %14;
1438 var.store %3 %15;
1439 java.break;
1440 }
1441 (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1442 %17 : java.type:"boolean" = pattern.match %16
1443 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1444 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1445 yield %18;
1446 }
1447 (%19 : java.type:"java.lang.String")java.type:"void" -> {
1448 var.store %8 %19;
1449 yield;
1450 };
1451 yield %17;
1452 }
1453 ()java.type:"void" -> {
1454 %20 : java.type:"java.lang.String" = var.load %3;
1455 %21 : java.type:"java.lang.String" = constant @"string";
1456 %22 : java.type:"java.lang.String" = concat %20 %21;
1457 var.store %3 %22;
1458 java.break;
1459 }
1460 ()java.type:"boolean" -> {
1461 %23 : java.type:"boolean" = constant @true;
1462 yield %23;
1463 }
1464 ()java.type:"void" -> {
1465 %24 : java.type:"java.lang.String" = var.load %3;
1466 %25 : java.type:"java.lang.String" = constant @"else";
1467 %26 : java.type:"java.lang.String" = concat %24 %25;
1468 var.store %3 %26;
1469 yield;
1470 };
1471 %27 : java.type:"java.lang.String" = var.load %3;
1472 return %27;
1473 };
1474 """)
1475 @Reflect
1476 private static String casePatternStatement(Object o) {
1477 String r = "";
1478 switch (o) {
1479 case Integer i:
1480 r += "integer";
1481 break;
1482 case String s:
1483 r += "string";
1484 break;
1485 default:
1486 r += "else";
1487 }
1488 return r;
1489 }
1490
1491 @IR("""
1492 func @"casePatternThrow" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1493 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1494 %2 : java.type:"java.lang.String" = constant @"";
1495 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1496 %4 : java.type:"java.lang.Object" = var.load %1;
1497 %5 : java.type:"java.lang.Number" = constant @null;
1498 %6 : Var<java.type:"java.lang.Number"> = var %5 @"n";
1499 %7 : java.type:"java.lang.String" = constant @null;
1500 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1501 java.switch.statement %4
1502 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1503 %10 : java.type:"boolean" = pattern.match %9
1504 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" -> {
1505 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1506 yield %11;
1507 }
1508 (%12 : java.type:"java.lang.Number")java.type:"void" -> {
1509 var.store %6 %12;
1510 yield;
1511 };
1512 yield %10;
1513 }
1514 ()java.type:"void" -> {
1515 %13 : java.type:"java.lang.IllegalArgumentException" = new @java.ref:"java.lang.IllegalArgumentException::()";
1516 throw %13;
1517 }
1518 (%14 : java.type:"java.lang.Object")java.type:"boolean" -> {
1519 %15 : java.type:"boolean" = pattern.match %14
1520 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1521 %16 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1522 yield %16;
1523 }
1524 (%17 : java.type:"java.lang.String")java.type:"void" -> {
1525 var.store %8 %17;
1526 yield;
1527 };
1528 yield %15;
1529 }
1530 ()java.type:"void" -> {
1531 %18 : java.type:"java.lang.String" = var.load %3;
1532 %19 : java.type:"java.lang.String" = constant @"a string";
1533 %20 : java.type:"java.lang.String" = concat %18 %19;
1534 var.store %3 %20;
1535 yield;
1536 }
1537 ()java.type:"boolean" -> {
1538 %21 : java.type:"boolean" = constant @true;
1539 yield %21;
1540 }
1541 ()java.type:"void" -> {
1542 %22 : java.type:"java.lang.String" = var.load %3;
1543 %23 : java.type:"java.lang.Object" = var.load %1;
1544 %24 : java.type:"java.lang.Class<?>" = invoke %23 @java.ref:"java.lang.Object::getClass():java.lang.Class";
1545 %25 : java.type:"java.lang.String" = invoke %24 @java.ref:"java.lang.Class::getName():java.lang.String";
1546 %26 : java.type:"java.lang.String" = concat %22 %25;
1547 var.store %3 %26;
1548 yield;
1549 };
1550 %27 : java.type:"java.lang.String" = var.load %3;
1551 return %27;
1552 };
1553 """)
1554 @Reflect
1555 private static String casePatternThrow(Object o) {
1556 String r = "";
1557 switch (o) {
1558 case Number n -> throw new IllegalArgumentException();
1559 case String s -> r += "a string";
1560 default -> r += o.getClass().getName();
1561 }
1562 return r;
1563 }
1564
1565 @IR("""
1566 func @"casePatternMultiLabel" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1567 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1568 %2 : java.type:"java.lang.String" = constant @"";
1569 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1570 %4 : java.type:"java.lang.Object" = var.load %1;
1571 %5 : java.type:"java.lang.Integer" = constant @null;
1572 %6 : Var<java.type:"java.lang.Integer"> = var %5;
1573 %7 : java.type:"java.lang.Long" = constant @null;
1574 %8 : Var<java.type:"java.lang.Long"> = var %7;
1575 %9 : java.type:"java.lang.Character" = constant @null;
1576 %10 : Var<java.type:"java.lang.Character"> = var %9;
1577 %11 : java.type:"java.lang.Byte" = constant @null;
1578 %12 : Var<java.type:"java.lang.Byte"> = var %11;
1579 %13 : java.type:"java.lang.Short" = constant @null;
1580 %14 : Var<java.type:"java.lang.Short"> = var %13;
1581 java.switch.statement %4
1582 (%15 : java.type:"java.lang.Object")java.type:"boolean" -> {
1583 %16 : java.type:"boolean" = java.cor
1584 ()java.type:"boolean" -> {
1585 %17 : java.type:"boolean" = pattern.match %15
1586 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1587 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type;
1588 yield %18;
1589 }
1590 (%19 : java.type:"java.lang.Integer")java.type:"void" -> {
1591 var.store %6 %19;
1592 yield;
1593 };
1594 yield %17;
1595 }
1596 ()java.type:"boolean" -> {
1597 %20 : java.type:"boolean" = pattern.match %15
1598 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Long>" -> {
1599 %21 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Long>" = pattern.type;
1600 yield %21;
1601 }
1602 (%22 : java.type:"java.lang.Long")java.type:"void" -> {
1603 var.store %8 %22;
1604 yield;
1605 };
1606 yield %20;
1607 }
1608 ()java.type:"boolean" -> {
1609 %23 : java.type:"boolean" = pattern.match %15
1610 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Character>" -> {
1611 %24 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Character>" = pattern.type;
1612 yield %24;
1613 }
1614 (%25 : java.type:"java.lang.Character")java.type:"void" -> {
1615 var.store %10 %25;
1616 yield;
1617 };
1618 yield %23;
1619 }
1620 ()java.type:"boolean" -> {
1621 %26 : java.type:"boolean" = pattern.match %15
1622 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Byte>" -> {
1623 %27 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Byte>" = pattern.type;
1624 yield %27;
1625 }
1626 (%28 : java.type:"java.lang.Byte")java.type:"void" -> {
1627 var.store %12 %28;
1628 yield;
1629 };
1630 yield %26;
1631 }
1632 ()java.type:"boolean" -> {
1633 %29 : java.type:"boolean" = pattern.match %15
1634 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Short>" -> {
1635 %30 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Short>" = pattern.type;
1636 yield %30;
1637 }
1638 (%31 : java.type:"java.lang.Short")java.type:"void" -> {
1639 var.store %14 %31;
1640 yield;
1641 };
1642 yield %29;
1643 };
1644 yield %16;
1645 }
1646 ()java.type:"void" -> {
1647 %32 : java.type:"java.lang.String" = var.load %3;
1648 %33 : java.type:"java.lang.String" = constant @"integral type";
1649 %34 : java.type:"java.lang.String" = concat %32 %33;
1650 var.store %3 %34;
1651 yield;
1652 }
1653 ()java.type:"boolean" -> {
1654 %35 : java.type:"boolean" = constant @true;
1655 yield %35;
1656 }
1657 ()java.type:"void" -> {
1658 %36 : java.type:"java.lang.String" = var.load %3;
1659 %37 : java.type:"java.lang.String" = constant @"non integral type";
1660 %38 : java.type:"java.lang.String" = concat %36 %37;
1661 var.store %3 %38;
1662 yield;
1663 };
1664 %39 : java.type:"java.lang.String" = var.load %3;
1665 return %39;
1666 };
1667 """)
1668 @Reflect
1669 private static String casePatternMultiLabel(Object o) {
1670 String r = "";
1671 switch (o) {
1672 case Integer _, Long _, Character _, Byte _, Short _-> r += "integral type";
1673 default -> r += "non integral type";
1674 }
1675 return r;
1676 }
1677
1678 @IR("""
1679 func @"casePatternGuardedMultiLabel" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1680 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1681 %2 : java.type:"java.lang.String" = constant @"";
1682 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1683 %4 : java.type:"java.lang.Object" = var.load %1;
1684 %5 : java.type:"java.lang.Integer" = constant @null;
1685 %6 : Var<java.type:"java.lang.Integer"> = var %5;
1686 %7 : java.type:"java.lang.Long" = constant @null;
1687 %8 : Var<java.type:"java.lang.Long"> = var %7;
1688 %9 : java.type:"java.lang.Byte" = constant @null;
1689 %10 : Var<java.type:"java.lang.Byte"> = var %9;
1690 %11 : java.type:"java.lang.Short" = constant @null;
1691 %12 : Var<java.type:"java.lang.Short"> = var %11;
1692 java.switch.statement %4
1693 (%13 : java.type:"java.lang.Object")java.type:"boolean" -> {
1694 %14 : java.type:"boolean" = java.cand
1695 ()java.type:"boolean" -> {
1696 %15 : java.type:"boolean" = java.cor
1697 ()java.type:"boolean" -> {
1698 %16 : java.type:"boolean" = pattern.match %13
1699 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1700 %17 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type;
1701 yield %17;
1702 }
1703 (%18 : java.type:"java.lang.Integer")java.type:"void" -> {
1704 var.store %6 %18;
1705 yield;
1706 };
1707 yield %16;
1708 }
1709 ()java.type:"boolean" -> {
1710 %19 : java.type:"boolean" = pattern.match %13
1711 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Long>" -> {
1712 %20 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Long>" = pattern.type;
1713 yield %20;
1714 }
1715 (%21 : java.type:"java.lang.Long")java.type:"void" -> {
1716 var.store %8 %21;
1717 yield;
1718 };
1719 yield %19;
1720 }
1721 ()java.type:"boolean" -> {
1722 %22 : java.type:"boolean" = pattern.match %13
1723 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Byte>" -> {
1724 %23 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Byte>" = pattern.type;
1725 yield %23;
1726 }
1727 (%24 : java.type:"java.lang.Byte")java.type:"void" -> {
1728 var.store %10 %24;
1729 yield;
1730 };
1731 yield %22;
1732 }
1733 ()java.type:"boolean" -> {
1734 %25 : java.type:"boolean" = pattern.match %13
1735 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Short>" -> {
1736 %26 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Short>" = pattern.type;
1737 yield %26;
1738 }
1739 (%27 : java.type:"java.lang.Short")java.type:"void" -> {
1740 var.store %12 %27;
1741 yield;
1742 };
1743 yield %25;
1744 };
1745 yield %15;
1746 }
1747 ()java.type:"boolean" -> {
1748 %28 : java.type:"java.lang.Object" = var.load %1;
1749 %29 : java.type:"java.lang.Number" = cast %28 @java.type:"java.lang.Number";
1750 %30 : java.type:"int" = invoke %29 @java.ref:"java.lang.Number::intValue():int";
1751 %31 : java.type:"int" = constant @0;
1752 %32 : java.type:"boolean" = gt %30 %31;
1753 yield %32;
1754 };
1755 yield %14;
1756 }
1757 ()java.type:"void" -> {
1758 %33 : java.type:"java.lang.String" = var.load %3;
1759 %34 : java.type:"java.lang.String" = constant @"integral type";
1760 %35 : java.type:"java.lang.String" = concat %33 %34;
1761 var.store %3 %35;
1762 yield;
1763 }
1764 ()java.type:"boolean" -> {
1765 %36 : java.type:"boolean" = constant @true;
1766 yield %36;
1767 }
1768 ()java.type:"void" -> {
1769 %37 : java.type:"java.lang.String" = var.load %3;
1770 %38 : java.type:"java.lang.String" = constant @"non integral type";
1771 %39 : java.type:"java.lang.String" = concat %37 %38;
1772 var.store %3 %39;
1773 yield;
1774 };
1775 %40 : java.type:"java.lang.String" = var.load %3;
1776 return %40;
1777 };
1778 """)
1779 @Reflect
1780 private static String casePatternGuardedMultiLabel(Object o) {
1781 String r = "";
1782 switch (o) {
1783 case Integer _, Long _, Byte _, Short _ when ((Number)o).intValue() > 0 -> r += "integral type";
1784 default -> r += "non integral type";
1785 }
1786 return r;
1787 }
1788
1789 @IR("""
1790 func @"casePatternWithCaseConstant" (%0 : java.type:"java.lang.Integer")java.type:"java.lang.String" -> {
1791 %1 : Var<java.type:"java.lang.Integer"> = var %0 @"a";
1792 %2 : java.type:"java.lang.String" = constant @"";
1793 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1794 %4 : java.type:"java.lang.Integer" = var.load %1;
1795 %5 : java.type:"java.lang.Integer" = constant @null;
1796 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1797 %7 : java.type:"java.lang.Integer" = constant @null;
1798 %8 : Var<java.type:"java.lang.Integer"> = var %7 @"i";
1799 java.switch.statement %4
1800 (%9 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1801 %10 : java.type:"int" = invoke %9 @java.ref:"java.lang.Integer::intValue():int";
1802 %11 : java.type:"int" = constant @42;
1803 %12 : java.type:"boolean" = eq %10 %11;
1804 yield %12;
1805 }
1806 ()java.type:"void" -> {
1807 %13 : java.type:"java.lang.String" = var.load %3;
1808 %14 : java.type:"java.lang.String" = constant @"forty two";
1809 %15 : java.type:"java.lang.String" = concat %13 %14;
1810 var.store %3 %15;
1811 yield;
1812 }
1813 (%16 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1814 %17 : java.type:"boolean" = java.cand
1815 ()java.type:"boolean" -> {
1816 %18 : java.type:"boolean" = pattern.match %16
1817 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1818 %19 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1819 yield %19;
1820 }
1821 (%20 : java.type:"java.lang.Integer")java.type:"void" -> {
1822 var.store %6 %20;
1823 yield;
1824 };
1825 yield %18;
1826 }
1827 ()java.type:"boolean" -> {
1828 %21 : java.type:"java.lang.Integer" = var.load %6;
1829 %22 : java.type:"int" = invoke %21 @java.ref:"java.lang.Integer::intValue():int";
1830 %23 : java.type:"int" = constant @0;
1831 %24 : java.type:"boolean" = gt %22 %23;
1832 yield %24;
1833 };
1834 yield %17;
1835 }
1836 ()java.type:"void" -> {
1837 %25 : java.type:"java.lang.String" = var.load %3;
1838 %26 : java.type:"java.lang.String" = constant @"positive int";
1839 %27 : java.type:"java.lang.String" = concat %25 %26;
1840 var.store %3 %27;
1841 yield;
1842 }
1843 (%28 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1844 %29 : java.type:"boolean" = java.cand
1845 ()java.type:"boolean" -> {
1846 %30 : java.type:"boolean" = pattern.match %28
1847 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1848 %31 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1849 yield %31;
1850 }
1851 (%32 : java.type:"java.lang.Integer")java.type:"void" -> {
1852 var.store %8 %32;
1853 yield;
1854 };
1855 yield %30;
1856 }
1857 ()java.type:"boolean" -> {
1858 %33 : java.type:"java.lang.Integer" = var.load %8;
1859 %34 : java.type:"int" = invoke %33 @java.ref:"java.lang.Integer::intValue():int";
1860 %35 : java.type:"int" = constant @0;
1861 %36 : java.type:"boolean" = lt %34 %35;
1862 yield %36;
1863 };
1864 yield %29;
1865 }
1866 ()java.type:"void" -> {
1867 %37 : java.type:"java.lang.String" = var.load %3;
1868 %38 : java.type:"java.lang.String" = constant @"negative int";
1869 %39 : java.type:"java.lang.String" = concat %37 %38;
1870 var.store %3 %39;
1871 yield;
1872 }
1873 ()java.type:"boolean" -> {
1874 %40 : java.type:"boolean" = constant @true;
1875 yield %40;
1876 }
1877 ()java.type:"void" -> {
1878 %41 : java.type:"java.lang.String" = var.load %3;
1879 %42 : java.type:"java.lang.String" = constant @"zero";
1880 %43 : java.type:"java.lang.String" = concat %41 %42;
1881 var.store %3 %43;
1882 yield;
1883 };
1884 %44 : java.type:"java.lang.String" = var.load %3;
1885 return %44;
1886 };
1887 """)
1888 @Reflect
1889 static String casePatternWithCaseConstant(Integer a) {
1890 String r = "";
1891 switch (a) {
1892 case 42 -> r += "forty two";
1893 case Integer i when i > 0 -> r += "positive int";
1894 case Integer i when i < 0 -> r += "negative int";
1895 default -> r += "zero";
1896 }
1897 return r;
1898 }
1899
1900 @IR("""
1901 func @"caseTypePattern" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1902 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1903 %2 : java.type:"java.lang.String" = constant @"";
1904 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1905 %4 : java.type:"java.lang.Object" = var.load %1;
1906 %5 : java.type:"java.lang.String" = constant @null;
1907 %6 : Var<java.type:"java.lang.String"> = var %5;
1908 %7 : java.type:"java.util.RandomAccess" = constant @null;
1909 %8 : Var<java.type:"java.util.RandomAccess"> = var %7;
1910 %9 : java.type:"int[]" = constant @null;
1911 %10 : Var<java.type:"int[]"> = var %9;
1912 %11 : java.type:"java.util.Stack[][]" = constant @null;
1913 %12 : Var<java.type:"java.util.Stack[][]"> = var %11;
1914 %13 : java.type:"java.util.Collection[][][]" = constant @null;
1915 %14 : Var<java.type:"java.util.Collection[][][]"> = var %13;
1916 %15 : java.type:"java.lang.Number" = constant @null;
1917 %16 : Var<java.type:"java.lang.Number"> = var %15 @"n";
1918 java.switch.statement %4
1919 (%17 : java.type:"java.lang.Object")java.type:"boolean" -> {
1920 %18 : java.type:"boolean" = pattern.match %17
1921 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1922 %19 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type;
1923 yield %19;
1924 }
1925 (%20 : java.type:"java.lang.String")java.type:"void" -> {
1926 var.store %6 %20;
1927 yield;
1928 };
1929 yield %18;
1930 }
1931 ()java.type:"void" -> {
1932 %21 : java.type:"java.lang.String" = var.load %3;
1933 %22 : java.type:"java.lang.String" = constant @"String";
1934 %23 : java.type:"java.lang.String" = concat %21 %22;
1935 var.store %3 %23;
1936 yield;
1937 }
1938 (%24 : java.type:"java.lang.Object")java.type:"boolean" -> {
1939 %25 : java.type:"boolean" = pattern.match %24
1940 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.RandomAccess>" -> {
1941 %26 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.RandomAccess>" = pattern.type;
1942 yield %26;
1943 }
1944 (%27 : java.type:"java.util.RandomAccess")java.type:"void" -> {
1945 var.store %8 %27;
1946 yield;
1947 };
1948 yield %25;
1949 }
1950 ()java.type:"void" -> {
1951 %28 : java.type:"java.lang.String" = var.load %3;
1952 %29 : java.type:"java.lang.String" = constant @"RandomAccess";
1953 %30 : java.type:"java.lang.String" = concat %28 %29;
1954 var.store %3 %30;
1955 yield;
1956 }
1957 (%31 : java.type:"java.lang.Object")java.type:"boolean" -> {
1958 %32 : java.type:"boolean" = pattern.match %31
1959 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<int[]>" -> {
1960 %33 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<int[]>" = pattern.type;
1961 yield %33;
1962 }
1963 (%34 : java.type:"int[]")java.type:"void" -> {
1964 var.store %10 %34;
1965 yield;
1966 };
1967 yield %32;
1968 }
1969 ()java.type:"void" -> {
1970 %35 : java.type:"java.lang.String" = var.load %3;
1971 %36 : java.type:"java.lang.String" = constant @"int[]";
1972 %37 : java.type:"java.lang.String" = concat %35 %36;
1973 var.store %3 %37;
1974 yield;
1975 }
1976 (%38 : java.type:"java.lang.Object")java.type:"boolean" -> {
1977 %39 : java.type:"boolean" = pattern.match %38
1978 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Stack[][]>" -> {
1979 %40 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Stack[][]>" = pattern.type;
1980 yield %40;
1981 }
1982 (%41 : java.type:"java.util.Stack[][]")java.type:"void" -> {
1983 var.store %12 %41;
1984 yield;
1985 };
1986 yield %39;
1987 }
1988 ()java.type:"void" -> {
1989 %42 : java.type:"java.lang.String" = var.load %3;
1990 %43 : java.type:"java.lang.String" = constant @"Stack[][]";
1991 %44 : java.type:"java.lang.String" = concat %42 %43;
1992 var.store %3 %44;
1993 yield;
1994 }
1995 (%45 : java.type:"java.lang.Object")java.type:"boolean" -> {
1996 %46 : java.type:"boolean" = pattern.match %45
1997 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Collection[][][]>" -> {
1998 %47 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Collection[][][]>" = pattern.type;
1999 yield %47;
2000 }
2001 (%48 : java.type:"java.util.Collection[][][]")java.type:"void" -> {
2002 var.store %14 %48;
2003 yield;
2004 };
2005 yield %46;
2006 }
2007 ()java.type:"void" -> {
2008 %49 : java.type:"java.lang.String" = var.load %3;
2009 %50 : java.type:"java.lang.String" = constant @"Collection[][][]";
2010 %51 : java.type:"java.lang.String" = concat %49 %50;
2011 var.store %3 %51;
2012 yield;
2013 }
2014 (%52 : java.type:"java.lang.Object")java.type:"boolean" -> {
2015 %53 : java.type:"boolean" = pattern.match %52
2016 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" -> {
2017 %54 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
2018 yield %54;
2019 }
2020 (%55 : java.type:"java.lang.Number")java.type:"void" -> {
2021 var.store %16 %55;
2022 yield;
2023 };
2024 yield %53;
2025 }
2026 ()java.type:"void" -> {
2027 %56 : java.type:"java.lang.String" = var.load %3;
2028 %57 : java.type:"java.lang.String" = constant @"Number";
2029 %58 : java.type:"java.lang.String" = concat %56 %57;
2030 var.store %3 %58;
2031 yield;
2032 }
2033 ()java.type:"boolean" -> {
2034 %59 : java.type:"boolean" = constant @true;
2035 yield %59;
2036 }
2037 ()java.type:"void" -> {
2038 %60 : java.type:"java.lang.String" = var.load %3;
2039 %61 : java.type:"java.lang.String" = constant @"something else";
2040 %62 : java.type:"java.lang.String" = concat %60 %61;
2041 var.store %3 %62;
2042 yield;
2043 };
2044 %63 : java.type:"java.lang.String" = var.load %3;
2045 return %63;
2046 };
2047 """)
2048 @Reflect
2049 static String caseTypePattern(Object o) {
2050 String r = "";
2051 switch (o) {
2052 case String _ -> r+= "String"; // class
2053 case RandomAccess _ -> r+= "RandomAccess"; // interface
2054 case int[] _ -> r+= "int[]"; // array primitive
2055 case Stack[][] _ -> r+= "Stack[][]"; // array class
2056 case Collection[][][] _ -> r+= "Collection[][][]"; // array interface
2057 case final Number n -> r+= "Number"; // final modifier
2058 default -> r+= "something else";
2059 }
2060 return r;
2061 }
2062
2063 record R(Number n) {}
2064 @IR("""
2065 func @"caseRecordPattern" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
2066 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
2067 %2 : java.type:"java.lang.String" = constant @"";
2068 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2069 %4 : java.type:"java.lang.Object" = var.load %1;
2070 %5 : java.type:"java.lang.Number" = constant @null;
2071 %6 : Var<java.type:"java.lang.Number"> = var %5 @"n";
2072 java.switch.statement %4
2073 (%7 : java.type:"java.lang.Object")java.type:"boolean" -> {
2074 %8 : java.type:"boolean" = pattern.match %7
2075 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" -> {
2076 %9 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
2077 %10 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" = pattern.record %9 @java.ref:"(java.lang.Number n)SwitchStatementTest$R";
2078 yield %10;
2079 }
2080 (%11 : java.type:"java.lang.Number")java.type:"void" -> {
2081 var.store %6 %11;
2082 yield;
2083 };
2084 yield %8;
2085 }
2086 ()java.type:"void" -> {
2087 %12 : java.type:"java.lang.String" = var.load %3;
2088 %13 : java.type:"java.lang.String" = constant @"R(_)";
2089 %14 : java.type:"java.lang.String" = concat %12 %13;
2090 var.store %3 %14;
2091 yield;
2092 }
2093 ()java.type:"boolean" -> {
2094 %15 : java.type:"boolean" = constant @true;
2095 yield %15;
2096 }
2097 ()java.type:"void" -> {
2098 %16 : java.type:"java.lang.String" = var.load %3;
2099 %17 : java.type:"java.lang.String" = constant @"else";
2100 %18 : java.type:"java.lang.String" = concat %16 %17;
2101 var.store %3 %18;
2102 yield;
2103 };
2104 %19 : java.type:"java.lang.String" = var.load %3;
2105 return %19;
2106 };
2107 """)
2108 @Reflect
2109 static String caseRecordPattern(Object o) {
2110 String r = "";
2111 switch (o) {
2112 case R(Number n) -> r += "R(_)";
2113 default -> r+= "else";
2114 }
2115 return r;
2116 }
2117
2118 @IR("""
2119 func @"casePatternGuard" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
2120 %1 : Var<java.type:"java.lang.Object"> = var %0 @"obj";
2121 %2 : java.type:"java.lang.String" = constant @"";
2122 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2123 %4 : java.type:"java.lang.Object" = var.load %1;
2124 %5 : java.type:"java.lang.String" = constant @null;
2125 %6 : Var<java.type:"java.lang.String"> = var %5 @"s";
2126 %7 : java.type:"java.lang.Number" = constant @null;
2127 %8 : Var<java.type:"java.lang.Number"> = var %7 @"n";
2128 java.switch.statement %4
2129 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
2130 %10 : java.type:"boolean" = java.cand
2131 ()java.type:"boolean" -> {
2132 %11 : java.type:"boolean" = pattern.match %9
2133 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
2134 %12 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
2135 yield %12;
2136 }
2137 (%13 : java.type:"java.lang.String")java.type:"void" -> {
2138 var.store %6 %13;
2139 yield;
2140 };
2141 yield %11;
2142 }
2143 ()java.type:"boolean" -> {
2144 %14 : java.type:"java.lang.String" = var.load %6;
2145 %15 : java.type:"int" = invoke %14 @java.ref:"java.lang.String::length():int";
2146 %16 : java.type:"int" = constant @3;
2147 %17 : java.type:"boolean" = gt %15 %16;
2148 yield %17;
2149 };
2150 yield %10;
2151 }
2152 ()java.type:"void" -> {
2153 %18 : java.type:"java.lang.String" = var.load %3;
2154 %19 : java.type:"java.lang.String" = constant @"str with length > %d";
2155 %20 : java.type:"java.lang.String" = var.load %6;
2156 %21 : java.type:"int" = invoke %20 @java.ref:"java.lang.String::length():int";
2157 %22 : java.type:"java.lang.Integer" = invoke %21 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
2158 %23 : java.type:"java.lang.String" = invoke %19 %22 @java.ref:"java.lang.String::formatted(java.lang.Object[]):java.lang.String" @invoke.kind="INSTANCE" @invoke.varargs=true;
2159 %24 : java.type:"java.lang.String" = concat %18 %23;
2160 var.store %3 %24;
2161 yield;
2162 }
2163 (%25 : java.type:"java.lang.Object")java.type:"boolean" -> {
2164 %26 : java.type:"boolean" = java.cand
2165 ()java.type:"boolean" -> {
2166 %27 : java.type:"boolean" = pattern.match %25
2167 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" -> {
2168 %28 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
2169 %29 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" = pattern.record %28 @java.ref:"(java.lang.Number n)SwitchStatementTest$R";
2170 yield %29;
2171 }
2172 (%30 : java.type:"java.lang.Number")java.type:"void" -> {
2173 var.store %8 %30;
2174 yield;
2175 };
2176 yield %27;
2177 }
2178 ()java.type:"boolean" -> {
2179 %31 : java.type:"java.lang.Number" = var.load %8;
2180 %32 : java.type:"java.lang.Class<?>" = invoke %31 @java.ref:"java.lang.Object::getClass():java.lang.Class";
2181 %33 : java.type:"java.lang.Class" = constant @java.type:"java.lang.Double";
2182 %34 : java.type:"boolean" = invoke %32 %33 @java.ref:"java.lang.Object::equals(java.lang.Object):boolean";
2183 yield %34;
2184 };
2185 yield %26;
2186 }
2187 ()java.type:"void" -> {
2188 %35 : java.type:"java.lang.String" = var.load %3;
2189 %36 : java.type:"java.lang.String" = constant @"R(Double)";
2190 %37 : java.type:"java.lang.String" = concat %35 %36;
2191 var.store %3 %37;
2192 yield;
2193 }
2194 ()java.type:"boolean" -> {
2195 %38 : java.type:"boolean" = constant @true;
2196 yield %38;
2197 }
2198 ()java.type:"void" -> {
2199 %39 : java.type:"java.lang.String" = var.load %3;
2200 %40 : java.type:"java.lang.String" = constant @"else";
2201 %41 : java.type:"java.lang.String" = concat %39 %40;
2202 var.store %3 %41;
2203 yield;
2204 };
2205 %42 : java.type:"java.lang.String" = var.load %3;
2206 return %42;
2207 };
2208 """)
2209 @Reflect
2210 static String casePatternGuard(Object obj) {
2211 String r = "";
2212 switch (obj) {
2213 case String s when s.length() > 3 -> r += "str with length > %d".formatted(s.length());
2214 case R(Number n) when n.getClass().equals(Double.class) -> r += "R(Double)";
2215 default -> r += "else";
2216 }
2217 return r;
2218 }
2219
2220 @IR("""
2221 func @"defaultCaseNotTheLast" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
2222 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
2223 %2 : java.type:"java.lang.String" = constant @"";
2224 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2225 %4 : java.type:"java.lang.String" = var.load %1;
2226 java.switch.statement %4
2227 ()java.type:"boolean" -> {
2228 %17 : java.type:"boolean" = constant @true;
2229 yield %17;
2230 }
2231 ()java.type:"void" -> {
2232 %18 : java.type:"java.lang.String" = var.load %3;
2233 %19 : java.type:"java.lang.String" = constant @"else";
2234 %20 : java.type:"java.lang.String" = concat %18 %19;
2235 var.store %3 %20;
2236 yield;
2237 }
2238 (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
2239 %6 : java.type:"java.lang.String" = constant @"M";
2240 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
2241 yield %7;
2242 }
2243 ()java.type:"void" -> {
2244 %8 : java.type:"java.lang.String" = var.load %3;
2245 %9 : java.type:"java.lang.String" = constant @"Mow";
2246 %10 : java.type:"java.lang.String" = concat %8 %9;
2247 var.store %3 %10;
2248 yield;
2249 }
2250 (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
2251 %12 : java.type:"java.lang.String" = constant @"A";
2252 %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
2253 yield %13;
2254 }
2255 ()java.type:"void" -> {
2256 %14 : java.type:"java.lang.String" = var.load %3;
2257 %15 : java.type:"java.lang.String" = constant @"Aow";
2258 %16 : java.type:"java.lang.String" = concat %14 %15;
2259 var.store %3 %16;
2260 yield;
2261 };
2262 %21 : java.type:"java.lang.String" = var.load %3;
2263 return %21;
2264 };
2265 """)
2266 @Reflect
2267 static String defaultCaseNotTheLast(String s) {
2268 String r = "";
2269 switch (s) {
2270 default -> r += "else";
2271 case "M" -> r += "Mow";
2272 case "A" -> r += "Aow";
2273 }
2274 return r;
2275 }
2276
2277 @IR("""
2278 func @"f" (%0 : java.type:"int")java.type:"int" -> {
2279 %1 : Var<java.type:"int"> = var %0 @"i";
2280 %2 : java.type:"int" = var.load %1;
2281 java.switch.statement %2
2282 (%3 : java.type:"int")java.type:"boolean" -> {
2283 %4 : java.type:"int" = constant @0;
2284 %5 : java.type:"boolean" = eq %3 %4;
2285 yield %5;
2286 }
2287 ()java.type:"void" -> {
2288 %6 : java.type:"int" = constant @0;
2289 return %6;
2290 };
2291 %7 : java.type:"int" = constant @0;
2292 return %7;
2293 };
2294 """)
2295 @Reflect
2296 static int f(int i) {
2297 switch (i) {
2298 case 0 -> {
2299 return 0;
2300 }
2301 }
2302 return 0;
2303 }
2304
2305 @IR("""
2306 func @"outOfOrderFallThrought" (%0 : java.type:"int")java.type:"java.lang.String" -> {
2307 %1 : Var<java.type:"int"> = var %0 @"i";
2308 %2 : java.type:"java.lang.String" = constant @"";
2309 %3 : Var<java.type:"java.lang.String"> = var %2 @"ret";
2310 %4 : java.type:"int" = var.load %1;
2311 java.switch.statement %4
2312 ()java.type:"boolean" -> {
2313 %5 : java.type:"boolean" = constant @true;
2314 yield %5;
2315 }
2316 ()java.type:"void" -> {
2317 %6 : java.type:"java.lang.String" = var.load %3;
2318 %7 : java.type:"java.lang.String" = constant @"? ";
2319 %8 : java.type:"java.lang.String" = concat %6 %7;
2320 var.store %3 %8;
2321 java.switch.fallthrough;
2322 }
2323 (%9 : java.type:"int")java.type:"boolean" -> {
2324 %10 : java.type:"int" = constant @4;
2325 %11 : java.type:"boolean" = eq %9 %10;
2326 yield %11;
2327 }
2328 ()java.type:"void" -> {
2329 %12 : java.type:"java.lang.String" = var.load %3;
2330 %13 : java.type:"java.lang.String" = constant @"four ";
2331 %14 : java.type:"java.lang.String" = concat %12 %13;
2332 var.store %3 %14;
2333 java.switch.fallthrough;
2334 }
2335 (%15 : java.type:"int")java.type:"boolean" -> {
2336 %16 : java.type:"int" = constant @2;
2337 %17 : java.type:"boolean" = eq %15 %16;
2338 yield %17;
2339 }
2340 ()java.type:"void" -> {
2341 %18 : java.type:"java.lang.String" = var.load %3;
2342 %19 : java.type:"java.lang.String" = constant @"two ";
2343 %20 : java.type:"java.lang.String" = concat %18 %19;
2344 var.store %3 %20;
2345 java.switch.fallthrough;
2346 }
2347 (%21 : java.type:"int")java.type:"boolean" -> {
2348 %22 : java.type:"int" = constant @3;
2349 %23 : java.type:"boolean" = eq %21 %22;
2350 yield %23;
2351 }
2352 ()java.type:"void" -> {
2353 %24 : java.type:"java.lang.String" = var.load %3;
2354 %25 : java.type:"java.lang.String" = constant @"three ";
2355 %26 : java.type:"java.lang.String" = concat %24 %25;
2356 var.store %3 %26;
2357 java.switch.fallthrough;
2358 }
2359 (%27 : java.type:"int")java.type:"boolean" -> {
2360 %28 : java.type:"int" = constant @1;
2361 %29 : java.type:"boolean" = eq %27 %28;
2362 yield %29;
2363 }
2364 ()java.type:"void" -> {
2365 %30 : java.type:"java.lang.String" = var.load %3;
2366 %31 : java.type:"java.lang.String" = constant @"one";
2367 %32 : java.type:"java.lang.String" = concat %30 %31;
2368 var.store %3 %32;
2369 yield;
2370 };
2371 %33 : java.type:"java.lang.String" = var.load %3;
2372 return %33;
2373 };
2374 """)
2375 @Reflect
2376 static String outOfOrderFallThrought(int i) {
2377 String ret = "";
2378 switch (i) {
2379 default:
2380 ret += "? ";
2381 case 4:
2382 ret += "four ";
2383 case 2:
2384 ret += "two ";
2385 case 3:
2386 ret += "three ";
2387 case 1:
2388 ret += "one";
2389 }
2390 return ret;
2391 }
2392
2393 @IR("""
2394 func @"caseConstantPrimitiveWrapperSelector" (%0 : java.type:"java.lang.Integer")java.type:"java.lang.String" -> {
2395 %1 : Var<java.type:"java.lang.Integer"> = var %0 @"i";
2396 %2 : java.type:"java.lang.String" = constant @"";
2397 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2398 %4 : java.type:"java.lang.Integer" = var.load %1;
2399 java.switch.statement %4
2400 (%5 : java.type:"java.lang.Integer")java.type:"boolean" -> {
2401 %6 : java.type:"int" = invoke %5 @java.ref:"java.lang.Integer::intValue():int";
2402 %7 : java.type:"int" = constant @1;
2403 %8 : java.type:"boolean" = eq %6 %7;
2404 yield %8;
2405 }
2406 ()java.type:"void" -> {
2407 %9 : java.type:"java.lang.String" = var.load %3;
2408 %10 : java.type:"java.lang.String" = constant @"one";
2409 %11 : java.type:"java.lang.String" = concat %9 %10;
2410 var.store %3 %11;
2411 yield;
2412 }
2413 (%12 : java.type:"java.lang.Integer")java.type:"boolean" -> {
2414 %13 : java.type:"boolean" = java.cor
2415 ()java.type:"boolean" -> {
2416 %14 : java.type:"int" = invoke %12 @java.ref:"java.lang.Integer::intValue():int";
2417 %15 : java.type:"int" = constant @2;
2418 %16 : java.type:"boolean" = eq %14 %15;
2419 yield %16;
2420 }
2421 ()java.type:"boolean" -> {
2422 %17 : java.type:"int" = invoke %12 @java.ref:"java.lang.Integer::intValue():int";
2423 %18 : java.type:"int" = constant @3;
2424 %19 : java.type:"boolean" = eq %17 %18;
2425 yield %19;
2426 };
2427 yield %13;
2428 }
2429 ()java.type:"void" -> {
2430 %20 : java.type:"java.lang.String" = var.load %3;
2431 %21 : java.type:"java.lang.String" = constant @"two or three";
2432 %22 : java.type:"java.lang.String" = concat %20 %21;
2433 var.store %3 %22;
2434 yield;
2435 }
2436 ()java.type:"boolean" -> {
2437 %23 : java.type:"boolean" = constant @true;
2438 yield %23;
2439 }
2440 ()java.type:"void" -> {
2441 %24 : java.type:"java.lang.String" = var.load %3;
2442 %25 : java.type:"java.lang.String" = constant @"else";
2443 %26 : java.type:"java.lang.String" = concat %24 %25;
2444 var.store %3 %26;
2445 yield;
2446 };
2447 %27 : java.type:"java.lang.String" = var.load %3;
2448 return %27;
2449 };
2450 """)
2451 @Reflect
2452 static String caseConstantPrimitiveWrapperSelector(Integer i) {
2453 String r = "";
2454 switch (i) {
2455 case 1 -> r += "one";
2456 case 2, 3 -> r += "two or three";
2457 default -> r += "else";
2458 };
2459 return r;
2460 }
2461
2462 @IR("""
2463 func @"constantLabelCasted" (%0 : java.type:"int")java.type:"java.lang.String" -> {
2464 %1 : Var<java.type:"int"> = var %0 @"i";
2465 %2 : java.type:"java.lang.String" = constant @"";
2466 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2467 %4 : java.type:"int" = var.load %1;
2468 java.switch.statement %4
2469 (%5 : java.type:"int")java.type:"boolean" -> {
2470 %6 : java.type:"int" = constant @1;
2471 %7 : java.type:"byte" = conv %6;
2472 %8 : java.type:"int" = conv %7;
2473 %9 : java.type:"boolean" = eq %5 %8;
2474 yield %9;
2475 }
2476 ()java.type:"void" -> {
2477 %10 : java.type:"java.lang.String" = var.load %3;
2478 %11 : java.type:"java.lang.String" = constant @"one";
2479 %12 : java.type:"java.lang.String" = concat %10 %11;
2480 var.store %3 %12;
2481 yield;
2482 }
2483 ()java.type:"boolean" -> {
2484 %13 : java.type:"boolean" = constant @true;
2485 yield %13;
2486 }
2487 ()java.type:"void" -> {
2488 %14 : java.type:"java.lang.String" = var.load %3;
2489 %15 : java.type:"java.lang.String" = constant @"not one";
2490 %16 : java.type:"java.lang.String" = concat %14 %15;
2491 var.store %3 %16;
2492 yield;
2493 };
2494 %17 : java.type:"java.lang.String" = var.load %3;
2495 return %17;
2496 };
2497 """)
2498 @Reflect
2499 static String constantLabelCasted(int i) {
2500 String r = "";
2501 switch (i) {
2502 case (byte) 1 -> r += "one";
2503 default -> r += "not one";
2504 };
2505 return r;
2506 }
2507
2508 @IR("""
2509 func @"caseConstantStringLiteral" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
2510 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
2511 %2 : java.type:"java.lang.String" = constant @"";
2512 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2513 %4 : java.type:"java.lang.String" = var.load %1;
2514 java.switch.statement %4
2515 (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
2516 %6 : java.type:"java.lang.String" = constant @"1";
2517 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
2518 yield %7;
2519 }
2520 ()java.type:"void" -> {
2521 %8 : java.type:"java.lang.String" = var.load %3;
2522 %9 : java.type:"java.lang.String" = constant @"one";
2523 %10 : java.type:"java.lang.String" = concat %8 %9;
2524 var.store %3 %10;
2525 yield;
2526 }
2527 (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
2528 %12 : java.type:"boolean" = java.cor
2529 ()java.type:"boolean" -> {
2530 %13 : java.type:"java.lang.String" = constant @"2";
2531 %14 : java.type:"boolean" = invoke %11 %13 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
2532 yield %14;
2533 }
2534 ()java.type:"boolean" -> {
2535 %15 : java.type:"java.lang.String" = constant @"3";
2536 %16 : java.type:"boolean" = invoke %11 %15 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
2537 yield %16;
2538 };
2539 yield %12;
2540 }
2541 ()java.type:"void" -> {
2542 %17 : java.type:"java.lang.String" = var.load %3;
2543 %18 : java.type:"java.lang.String" = constant @"two or three";
2544 %19 : java.type:"java.lang.String" = concat %17 %18;
2545 var.store %3 %19;
2546 yield;
2547 }
2548 ()java.type:"boolean" -> {
2549 %20 : java.type:"boolean" = constant @true;
2550 yield %20;
2551 }
2552 ()java.type:"void" -> {
2553 %21 : java.type:"java.lang.String" = var.load %3;
2554 %22 : java.type:"java.lang.String" = constant @"else";
2555 %23 : java.type:"java.lang.String" = concat %21 %22;
2556 var.store %3 %23;
2557 yield;
2558 };
2559 %24 : java.type:"java.lang.String" = var.load %3;
2560 return %24;
2561 };
2562 """)
2563 @Reflect
2564 static String caseConstantStringLiteral(String s) {
2565 String r = "";
2566 switch (s) {
2567 case "1" -> r += "one";
2568 case "2", "3" -> r+= "two or three";
2569 default -> r += "else";
2570 };
2571 return r;
2572 }
2573
2574 @IR("""
2575 func @"caseBoxedGuard" (%0 : java.type:"java.lang.Object", %1 : java.type:"java.lang.Boolean")java.type:"java.lang.String" -> {
2576 %2 : Var<java.type:"java.lang.Object"> = var %0 @"o";
2577 %3 : Var<java.type:"java.lang.Boolean"> = var %1 @"B";
2578 %4 : java.type:"java.lang.String" = constant @"";
2579 %5 : Var<java.type:"java.lang.String"> = var %4 @"r";
2580 %6 : java.type:"java.lang.Object" = var.load %2;
2581 %7 : java.type:"java.lang.Object" = constant @null;
2582 %8 : Var<java.type:"java.lang.Object"> = var %7;
2583 java.switch.statement %6
2584 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
2585 %10 : java.type:"boolean" = java.cand
2586 ()java.type:"boolean" -> {
2587 %11 : java.type:"boolean" = pattern.match %9
2588 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Object>" -> {
2589 %12 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Object>" = pattern.type;
2590 yield %12;
2591 }
2592 (%13 : java.type:"java.lang.Object")java.type:"void" -> {
2593 var.store %8 %13;
2594 yield;
2595 };
2596 yield %11;
2597 }
2598 ()java.type:"boolean" -> {
2599 %14 : java.type:"java.lang.Boolean" = var.load %3;
2600 %15 : java.type:"boolean" = invoke %14 @java.ref:"java.lang.Boolean::booleanValue():boolean";
2601 yield %15;
2602 };
2603 yield %10;
2604 }
2605 ()java.type:"void" -> {
2606 %16 : java.type:"java.lang.String" = var.load %5;
2607 %17 : java.type:"java.lang.String" = constant @"match";
2608 %18 : java.type:"java.lang.String" = concat %16 %17;
2609 var.store %5 %18;
2610 yield;
2611 }
2612 ()java.type:"boolean" -> {
2613 %19 : java.type:"boolean" = constant @true;
2614 yield %19;
2615 }
2616 ()java.type:"void" -> {
2617 %20 : java.type:"java.lang.String" = var.load %5;
2618 %21 : java.type:"java.lang.String" = constant @"no match";
2619 %22 : java.type:"java.lang.String" = concat %20 %21;
2620 var.store %5 %22;
2621 yield;
2622 };
2623 %23 : java.type:"java.lang.String" = var.load %5;
2624 return %23;
2625 };
2626 """)
2627 @Reflect
2628 private static String caseBoxedGuard(Object o, Boolean B) {
2629 String r = "";
2630 switch (o) {
2631 case Object _ when B -> r += "match";
2632 default -> r += "no match";
2633 }
2634 return r;
2635 }
2636 }