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