1 import jdk.incubator.code.CodeReflection;
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 @CodeReflection
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 @CodeReflection
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 @CodeReflection
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 @CodeReflection
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" = constant @8;
321 %7 : java.type:"java.lang.Integer" = invoke %6 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
322 %8 : java.type:"boolean" = invoke %5 %7 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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" = constant @9;
331 %12 : java.type:"java.lang.Integer" = invoke %11 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
332 %13 : java.type:"boolean" = invoke %10 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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 @CodeReflection
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 @CodeReflection
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 // @CodeReflection
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 @CodeReflection
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" = invoke %5 %7 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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" = invoke %5 %9 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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" = invoke %5 %11 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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" = invoke %16 %17 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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" = invoke %22 %24 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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" = invoke %22 %26 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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" = invoke %31 %32 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
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 @CodeReflection
565 private static String caseConstantEnum(Day d) {
566 String r = "";
567 switch (d) {
568 // @@@ concat of String and int is modeled as: add str Integer
569 case MON, FRI, SUN -> r += 6;
570 case TUE -> r += 7;
571 case THU, SAT -> r += 8;
572 case WED -> r += 9;
573 }
574 return r;
575 }
576
577 static class Constants {
578 static final int c1 = 12;
579 }
580 @IR("""
581 func @"caseConstantOtherKindsOfExpr" (%0 : java.type:"int")java.type:"java.lang.String" -> {
582 %1 : Var<java.type:"int"> = var %0 @"i";
583 %2 : java.type:"java.lang.String" = constant @"";
584 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
585 %4 : java.type:"int" = constant @11;
586 %5 : Var<java.type:"int"> = var %4 @"eleven";
587 %6 : java.type:"int" = var.load %1;
588 java.switch.statement %6
589 (%7 : java.type:"int")java.type:"boolean" -> {
590 %8 : java.type:"int" = constant @1;
591 %9 : java.type:"int" = constant @15;
592 %10 : java.type:"int" = and %8 %9;
593 %11 : java.type:"boolean" = eq %7 %10;
594 yield %11;
595 }
596 ()java.type:"void" -> {
597 %12 : java.type:"java.lang.String" = var.load %3;
598 %13 : java.type:"int" = constant @1;
599 %14 : java.type:"java.lang.String" = concat %12 %13;
600 var.store %3 %14;
601 yield;
602 }
603 (%15 : java.type:"int")java.type:"boolean" -> {
604 %16 : java.type:"int" = constant @4;
605 %17 : java.type:"int" = constant @1;
606 %18 : java.type:"int" = ashr %16 %17;
607 %19 : java.type:"boolean" = eq %15 %18;
608 yield %19;
609 }
610 ()java.type:"void" -> {
611 %20 : java.type:"java.lang.String" = var.load %3;
612 %21 : java.type:"java.lang.String" = constant @"2";
613 %22 : java.type:"java.lang.String" = concat %20 %21;
614 var.store %3 %22;
615 yield;
616 }
617 (%23 : java.type:"int")java.type:"boolean" -> {
618 %24 : java.type:"long" = constant @3;
619 %25 : java.type:"int" = conv %24;
620 %26 : java.type:"boolean" = eq %23 %25;
621 yield %26;
622 }
623 ()java.type:"void" -> {
624 %27 : java.type:"java.lang.String" = var.load %3;
625 %28 : java.type:"int" = constant @3;
626 %29 : java.type:"java.lang.String" = concat %27 %28;
627 var.store %3 %29;
628 yield;
629 }
630 (%30 : java.type:"int")java.type:"boolean" -> {
631 %31 : java.type:"int" = constant @2;
632 %32 : java.type:"int" = constant @1;
633 %33 : java.type:"int" = lshl %31 %32;
634 %34 : java.type:"boolean" = eq %30 %33;
635 yield %34;
636 }
637 ()java.type:"void" -> {
638 %35 : java.type:"java.lang.String" = var.load %3;
639 %36 : java.type:"int" = constant @4;
640 %37 : java.type:"java.lang.String" = concat %35 %36;
641 var.store %3 %37;
642 yield;
643 }
644 (%38 : java.type:"int")java.type:"boolean" -> {
645 %39 : java.type:"int" = constant @10;
646 %40 : java.type:"int" = constant @2;
647 %41 : java.type:"int" = div %39 %40;
648 %42 : java.type:"boolean" = eq %38 %41;
649 yield %42;
650 }
651 ()java.type:"void" -> {
652 %43 : java.type:"java.lang.String" = var.load %3;
653 %44 : java.type:"int" = constant @5;
654 %45 : java.type:"java.lang.String" = concat %43 %44;
655 var.store %3 %45;
656 yield;
657 }
658 (%46 : java.type:"int")java.type:"boolean" -> {
659 %47 : java.type:"int" = constant @12;
660 %48 : java.type:"int" = constant @6;
661 %49 : java.type:"int" = sub %47 %48;
662 %50 : java.type:"boolean" = eq %46 %49;
663 yield %50;
664 }
665 ()java.type:"void" -> {
666 %51 : java.type:"java.lang.String" = var.load %3;
667 %52 : java.type:"int" = constant @6;
668 %53 : java.type:"java.lang.String" = concat %51 %52;
669 var.store %3 %53;
670 yield;
671 }
672 (%54 : java.type:"int")java.type:"boolean" -> {
673 %55 : java.type:"int" = constant @3;
674 %56 : java.type:"int" = constant @4;
675 %57 : java.type:"int" = add %55 %56;
676 %58 : java.type:"boolean" = eq %54 %57;
677 yield %58;
678 }
679 ()java.type:"void" -> {
680 %59 : java.type:"java.lang.String" = var.load %3;
681 %60 : java.type:"int" = constant @7;
682 %61 : java.type:"java.lang.String" = concat %59 %60;
683 var.store %3 %61;
684 yield;
685 }
686 (%62 : java.type:"int")java.type:"boolean" -> {
687 %63 : java.type:"int" = constant @2;
688 %64 : java.type:"int" = constant @2;
689 %65 : java.type:"int" = mul %63 %64;
690 %66 : java.type:"int" = constant @2;
691 %67 : java.type:"int" = mul %65 %66;
692 %68 : java.type:"boolean" = eq %62 %67;
693 yield %68;
694 }
695 ()java.type:"void" -> {
696 %69 : java.type:"java.lang.String" = var.load %3;
697 %70 : java.type:"int" = constant @8;
698 %71 : java.type:"java.lang.String" = concat %69 %70;
699 var.store %3 %71;
700 yield;
701 }
702 (%72 : java.type:"int")java.type:"boolean" -> {
703 %73 : java.type:"int" = constant @8;
704 %74 : java.type:"int" = constant @1;
705 %75 : java.type:"int" = or %73 %74;
706 %76 : java.type:"boolean" = eq %72 %75;
707 yield %76;
708 }
709 ()java.type:"void" -> {
710 %77 : java.type:"java.lang.String" = var.load %3;
711 %78 : java.type:"int" = constant @9;
712 %79 : java.type:"java.lang.String" = concat %77 %78;
713 var.store %3 %79;
714 yield;
715 }
716 (%80 : java.type:"int")java.type:"boolean" -> {
717 %81 : java.type:"int" = constant @10;
718 %82 : java.type:"boolean" = eq %80 %81;
719 yield %82;
720 }
721 ()java.type:"void" -> {
722 %83 : java.type:"java.lang.String" = var.load %3;
723 %84 : java.type:"int" = constant @10;
724 %85 : java.type:"java.lang.String" = concat %83 %84;
725 var.store %3 %85;
726 yield;
727 }
728 (%86 : java.type:"int")java.type:"boolean" -> {
729 %87 : java.type:"int" = var.load %5;
730 %88 : java.type:"boolean" = eq %86 %87;
731 yield %88;
732 }
733 ()java.type:"void" -> {
734 %89 : java.type:"java.lang.String" = var.load %3;
735 %90 : java.type:"int" = constant @11;
736 %91 : java.type:"java.lang.String" = concat %89 %90;
737 var.store %3 %91;
738 yield;
739 }
740 (%92 : java.type:"int")java.type:"boolean" -> {
741 %93 : java.type:"int" = field.load @java.ref:"SwitchStatementTest$Constants::c1:int";
742 %94 : java.type:"boolean" = eq %92 %93;
743 yield %94;
744 }
745 ()java.type:"void" -> {
746 %95 : java.type:"java.lang.String" = var.load %3;
747 %96 : java.type:"int" = field.load @java.ref:"SwitchStatementTest$Constants::c1:int";
748 %97 : java.type:"java.lang.String" = concat %95 %96;
749 var.store %3 %97;
750 yield;
751 }
752 (%98 : java.type:"int")java.type:"boolean" -> {
753 %99 : java.type:"int" = java.cexpression
754 ()java.type:"boolean" -> {
755 %100 : java.type:"int" = constant @1;
756 %101 : java.type:"int" = constant @0;
757 %102 : java.type:"boolean" = gt %100 %101;
758 yield %102;
759 }
760 ()java.type:"int" -> {
761 %103 : java.type:"int" = constant @13;
762 yield %103;
763 }
764 ()java.type:"int" -> {
765 %104 : java.type:"int" = constant @133;
766 yield %104;
767 };
768 %105 : java.type:"boolean" = eq %98 %99;
769 yield %105;
770 }
771 ()java.type:"void" -> {
772 %106 : java.type:"java.lang.String" = var.load %3;
773 %107 : java.type:"int" = constant @13;
774 %108 : java.type:"java.lang.String" = concat %106 %107;
775 var.store %3 %108;
776 yield;
777 }
778 ()java.type:"boolean" -> {
779 %109 : java.type:"boolean" = constant @true;
780 yield %109;
781 }
782 ()java.type:"void" -> {
783 %110 : java.type:"java.lang.String" = var.load %3;
784 %111 : java.type:"java.lang.String" = constant @"an int";
785 %112 : java.type:"java.lang.String" = concat %110 %111;
786 var.store %3 %112;
787 yield;
788 };
789 %113 : java.type:"java.lang.String" = var.load %3;
790 return %113;
791 };
792 """)
793 @CodeReflection
794 private static String caseConstantOtherKindsOfExpr(int i) {
795 String r = "";
796 final int eleven = 11;
797 switch (i) {
798 case 1 & 0xF -> r += 1;
799 case 4>>1 -> r += "2";
800 case (int) 3L -> r += 3;
801 case 2<<1 -> r += 4;
802 case 10 / 2 -> r += 5;
803 case 12 - 6 -> r += 6;
804 case 3 + 4 -> r += 7;
805 case 2 * 2 * 2 -> r += 8;
806 case 8 | 1 -> r += 9;
807 case (10) -> r += 10;
808 case eleven -> r += 11;
809 case Constants.c1 -> r += Constants.c1;
810 case 1 > 0 ? 13 : 133 -> r += 13;
811 default -> r += "an int";
812 }
813 return r;
814 }
815
816 @IR("""
817 func @"caseConstantConv" (%0 : java.type:"short")java.type:"java.lang.String" -> {
818 %1 : Var<java.type:"short"> = var %0 @"a";
819 %2 : java.type:"int" = constant @1;
820 %3 : java.type:"short" = conv %2;
821 %4 : Var<java.type:"short"> = var %3 @"s";
822 %5 : java.type:"int" = constant @2;
823 %6 : java.type:"byte" = conv %5;
824 %7 : Var<java.type:"byte"> = var %6 @"b";
825 %8 : java.type:"java.lang.String" = constant @"";
826 %9 : Var<java.type:"java.lang.String"> = var %8 @"r";
827 %10 : java.type:"short" = var.load %1;
828 java.switch.statement %10
829 (%11 : java.type:"short")java.type:"boolean" -> {
830 %12 : java.type:"short" = var.load %4;
831 %13 : java.type:"boolean" = eq %11 %12;
832 yield %13;
833 }
834 ()java.type:"void" -> {
835 %14 : java.type:"java.lang.String" = var.load %9;
836 %15 : java.type:"java.lang.String" = constant @"one";
837 %16 : java.type:"java.lang.String" = concat %14 %15;
838 var.store %9 %16;
839 yield;
840 }
841 (%17 : java.type:"short")java.type:"boolean" -> {
842 %18 : java.type:"byte" = var.load %7;
843 %19 : java.type:"short" = conv %18;
844 %20 : java.type:"boolean" = eq %17 %19;
845 yield %20;
846 }
847 ()java.type:"void" -> {
848 %21 : java.type:"java.lang.String" = var.load %9;
849 %22 : java.type:"java.lang.String" = constant @"two";
850 %23 : java.type:"java.lang.String" = concat %21 %22;
851 var.store %9 %23;
852 yield;
853 }
854 (%24 : java.type:"short")java.type:"boolean" -> {
855 %25 : java.type:"int" = constant @3;
856 %26 : java.type:"short" = conv %25;
857 %27 : java.type:"boolean" = eq %24 %26;
858 yield %27;
859 }
860 ()java.type:"void" -> {
861 %28 : java.type:"java.lang.String" = var.load %9;
862 %29 : java.type:"java.lang.String" = constant @"three";
863 %30 : java.type:"java.lang.String" = concat %28 %29;
864 var.store %9 %30;
865 yield;
866 }
867 ()java.type:"boolean" -> {
868 %31 : java.type:"boolean" = constant @true;
869 yield %31;
870 }
871 ()java.type:"void" -> {
872 %32 : java.type:"java.lang.String" = var.load %9;
873 %33 : java.type:"java.lang.String" = constant @"else";
874 %34 : java.type:"java.lang.String" = concat %32 %33;
875 var.store %9 %34;
876 yield;
877 };
878 %35 : java.type:"java.lang.String" = var.load %9;
879 return %35;
880 };
881 """)
882 @CodeReflection
883 static String caseConstantConv(short a) {
884 final short s = 1;
885 final byte b = 2;
886 String r = "";
887 switch (a) {
888 case s -> r += "one"; // identity, short -> short
889 case b -> r += "two"; // widening primitive conversion, byte -> short
890 case 3 -> r += "three"; // narrowing primitive conversion, int -> short
891 default -> r += "else";
892 }
893 return r;
894 }
895
896 @IR("""
897 func @"caseConstantConv2" (%0 : java.type:"java.lang.Byte")java.type:"java.lang.String" -> {
898 %1 : Var<java.type:"java.lang.Byte"> = var %0 @"a";
899 %2 : java.type:"int" = constant @2;
900 %3 : java.type:"byte" = conv %2;
901 %4 : Var<java.type:"byte"> = var %3 @"b";
902 %5 : java.type:"java.lang.String" = constant @"";
903 %6 : Var<java.type:"java.lang.String"> = var %5 @"r";
904 %7 : java.type:"java.lang.Byte" = var.load %1;
905 java.switch.statement %7
906 (%8 : java.type:"java.lang.Byte")java.type:"boolean" -> {
907 %9 : java.type:"int" = constant @1;
908 %10 : java.type:"byte" = conv %9;
909 %11 : java.type:"java.lang.Byte" = invoke %10 @java.ref:"java.lang.Byte::valueOf(byte):java.lang.Byte";
910 %12 : java.type:"boolean" = invoke %8 %11 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
911 yield %12;
912 }
913 ()java.type:"void" -> {
914 %13 : java.type:"java.lang.String" = var.load %6;
915 %14 : java.type:"java.lang.String" = constant @"one";
916 %15 : java.type:"java.lang.String" = concat %13 %14;
917 var.store %6 %15;
918 yield;
919 }
920 (%16 : java.type:"java.lang.Byte")java.type:"boolean" -> {
921 %17 : java.type:"byte" = var.load %4;
922 %18 : java.type:"java.lang.Byte" = invoke %17 @java.ref:"java.lang.Byte::valueOf(byte):java.lang.Byte";
923 %19 : java.type:"boolean" = invoke %16 %18 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
924 yield %19;
925 }
926 ()java.type:"void" -> {
927 %20 : java.type:"java.lang.String" = var.load %6;
928 %21 : java.type:"java.lang.String" = constant @"two";
929 %22 : java.type:"java.lang.String" = concat %20 %21;
930 var.store %6 %22;
931 yield;
932 }
933 ()java.type:"boolean" -> {
934 %23 : java.type:"boolean" = constant @true;
935 yield %23;
936 }
937 ()java.type:"void" -> {
938 %24 : java.type:"java.lang.String" = var.load %6;
939 %25 : java.type:"java.lang.String" = constant @"default";
940 %26 : java.type:"java.lang.String" = concat %24 %25;
941 var.store %6 %26;
942 yield;
943 };
944 %27 : java.type:"java.lang.String" = var.load %6;
945 return %27;
946 };
947 """)
948 @CodeReflection
949 static String caseConstantConv2(Byte a) {
950 final byte b = 2;
951 String r = "";
952 switch (a) {
953 case 1 -> r+= "one"; // narrowing primitive conversion followed by a boxing conversion, int -> bye -> Byte
954 case b -> r+= "two"; // boxing, byte -> Byte
955 default -> r+= "default";
956 }
957 return r;
958 }
959
960 @IR("""
961 func @"nonEnhancedSwStatNoDefault" (%0 : java.type:"int")java.type:"java.lang.String" -> {
962 %1 : Var<java.type:"int"> = var %0 @"a";
963 %2 : java.type:"java.lang.String" = constant @"";
964 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
965 %4 : java.type:"int" = var.load %1;
966 java.switch.statement %4
967 (%5 : java.type:"int")java.type:"boolean" -> {
968 %6 : java.type:"int" = constant @1;
969 %7 : java.type:"boolean" = eq %5 %6;
970 yield %7;
971 }
972 ()java.type:"void" -> {
973 %8 : java.type:"java.lang.String" = var.load %3;
974 %9 : java.type:"java.lang.String" = constant @"1";
975 %10 : java.type:"java.lang.String" = concat %8 %9;
976 var.store %3 %10;
977 yield;
978 }
979 (%11 : java.type:"int")java.type:"boolean" -> {
980 %12 : java.type:"int" = constant @2;
981 %13 : java.type:"boolean" = eq %11 %12;
982 yield %13;
983 }
984 ()java.type:"void" -> {
985 %14 : java.type:"java.lang.String" = var.load %3;
986 %15 : java.type:"int" = constant @2;
987 %16 : java.type:"java.lang.String" = concat %14 %15;
988 var.store %3 %16;
989 yield;
990 };
991 %17 : java.type:"java.lang.String" = var.load %3;
992 return %17;
993 };
994 """)
995 @CodeReflection
996 static String nonEnhancedSwStatNoDefault(int a) {
997 String r = "";
998 switch (a) {
999 case 1 -> r += "1";
1000 case 2 -> r += 2;
1001 }
1002 return r;
1003 }
1004
1005 enum E {A, B}
1006 @IR("""
1007 func @"enhancedSwStatNoDefault1" (%0 : java.type:"SwitchStatementTest$E")java.type:"java.lang.String" -> {
1008 %1 : Var<java.type:"SwitchStatementTest$E"> = var %0 @"e";
1009 %2 : java.type:"java.lang.String" = constant @"";
1010 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1011 %4 : java.type:"SwitchStatementTest$E" = var.load %1;
1012 java.switch.statement %4
1013 (%5 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1014 %6 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::A:SwitchStatementTest$E";
1015 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1016 yield %7;
1017 }
1018 ()java.type:"void" -> {
1019 %8 : java.type:"java.lang.String" = var.load %3;
1020 %9 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::A:SwitchStatementTest$E";
1021 %10 : java.type:"java.lang.String" = cast %9 @java.type:"java.lang.String";
1022 %11 : java.type:"java.lang.String" = concat %8 %10;
1023 var.store %3 %11;
1024 yield;
1025 }
1026 (%12 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1027 %13 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::B:SwitchStatementTest$E";
1028 %14 : java.type:"boolean" = invoke %12 %13 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1029 yield %14;
1030 }
1031 ()java.type:"void" -> {
1032 %15 : java.type:"java.lang.String" = var.load %3;
1033 %16 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::B:SwitchStatementTest$E";
1034 %17 : java.type:"java.lang.String" = cast %16 @java.type:"java.lang.String";
1035 %18 : java.type:"java.lang.String" = concat %15 %17;
1036 var.store %3 %18;
1037 yield;
1038 }
1039 (%19 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1040 %20 : java.type:"java.lang.Object" = constant @null;
1041 %21 : java.type:"boolean" = invoke %19 %20 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1042 yield %21;
1043 }
1044 ()java.type:"void" -> {
1045 %22 : java.type:"java.lang.String" = var.load %3;
1046 %23 : java.type:"java.lang.String" = constant @"null";
1047 %24 : java.type:"java.lang.String" = concat %22 %23;
1048 var.store %3 %24;
1049 yield;
1050 }
1051 ()java.type:"boolean" -> {
1052 %25 : java.type:"boolean" = constant @true;
1053 yield %25;
1054 }
1055 ()java.type:"void" -> {
1056 %26 : java.type:"java.lang.MatchException" = new @java.ref:"java.lang.MatchException::()";
1057 throw %26;
1058 };
1059 %27 : java.type:"java.lang.String" = var.load %3;
1060 return %27;
1061 };
1062 """)
1063 @CodeReflection
1064 static String enhancedSwStatNoDefault1(E e) {
1065 String r = "";
1066 switch (e) {
1067 case A -> r += E.A;
1068 case B -> r += E.B;
1069 case null -> r += "null";
1070 }
1071 return r;
1072 }
1073
1074 sealed interface I permits K, J {}
1075 record K() implements I {}
1076 static final class J implements I {}
1077 @IR("""
1078 func @"enhancedSwStatNoDefault2" (%0 : java.type:"SwitchStatementTest$I")java.type:"java.lang.String" -> {
1079 %1 : Var<java.type:"SwitchStatementTest$I"> = var %0 @"i";
1080 %2 : java.type:"java.lang.String" = constant @"";
1081 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1082 %4 : java.type:"SwitchStatementTest$I" = var.load %1;
1083 %5 : java.type:"SwitchStatementTest$K" = constant @null;
1084 %6 : Var<java.type:"SwitchStatementTest$K"> = var %5 @"k";
1085 %7 : java.type:"SwitchStatementTest$J" = constant @null;
1086 %8 : Var<java.type:"SwitchStatementTest$J"> = var %7 @"j";
1087 java.switch.statement %4
1088 (%9 : java.type:"SwitchStatementTest$I")java.type:"boolean" -> {
1089 %10 : java.type:"boolean" = pattern.match %9
1090 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$K>" -> {
1091 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$K>" = pattern.type @"k";
1092 yield %11;
1093 }
1094 (%12 : java.type:"SwitchStatementTest$K")java.type:"void" -> {
1095 var.store %6 %12;
1096 yield;
1097 };
1098 yield %10;
1099 }
1100 ()java.type:"void" -> {
1101 %13 : java.type:"java.lang.String" = var.load %3;
1102 %14 : java.type:"java.lang.String" = constant @"K";
1103 %15 : java.type:"java.lang.String" = concat %13 %14;
1104 var.store %3 %15;
1105 yield;
1106 }
1107 (%16 : java.type:"SwitchStatementTest$I")java.type:"boolean" -> {
1108 %17 : java.type:"boolean" = pattern.match %16
1109 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$J>" -> {
1110 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$J>" = pattern.type @"j";
1111 yield %18;
1112 }
1113 (%19 : java.type:"SwitchStatementTest$J")java.type:"void" -> {
1114 var.store %8 %19;
1115 yield;
1116 };
1117 yield %17;
1118 }
1119 ()java.type:"void" -> {
1120 %20 : java.type:"java.lang.String" = var.load %3;
1121 %21 : java.type:"java.lang.String" = constant @"J";
1122 %22 : java.type:"java.lang.String" = concat %20 %21;
1123 var.store %3 %22;
1124 yield;
1125 }
1126 ()java.type:"boolean" -> {
1127 %23 : java.type:"boolean" = constant @true;
1128 yield %23;
1129 }
1130 ()java.type:"void" -> {
1131 %24 : java.type:"java.lang.MatchException" = new @java.ref:"java.lang.MatchException::()";
1132 throw %24;
1133 };
1134 %25 : java.type:"java.lang.String" = var.load %3;
1135 return %25;
1136 };
1137 """)
1138 @CodeReflection
1139 static String enhancedSwStatNoDefault2(I i) {
1140 String r = "";
1141 switch (i) {
1142 case K k -> r += "K";
1143 case J j -> r += "J";
1144 }
1145 return r;
1146 }
1147
1148 @IR("""
1149 func @"enhancedSwStatUnconditionalPattern" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
1150 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
1151 %2 : java.type:"java.lang.String" = constant @"";
1152 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1153 %4 : java.type:"java.lang.String" = var.load %1;
1154 %5 : java.type:"java.lang.Object" = constant @null;
1155 %6 : Var<java.type:"java.lang.Object"> = var %5 @"o";
1156 java.switch.statement %4
1157 (%7 : java.type:"java.lang.String")java.type:"boolean" -> {
1158 %8 : java.type:"java.lang.String" = constant @"A";
1159 %9 : java.type:"boolean" = invoke %7 %8 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1160 yield %9;
1161 }
1162 ()java.type:"void" -> {
1163 %10 : java.type:"java.lang.String" = var.load %3;
1164 %11 : java.type:"java.lang.String" = constant @"A";
1165 %12 : java.type:"java.lang.String" = concat %10 %11;
1166 var.store %3 %12;
1167 yield;
1168 }
1169 (%13 : java.type:"java.lang.String")java.type:"boolean" -> {
1170 %14 : java.type:"boolean" = pattern.match %13
1171 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Object>" -> {
1172 %15 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Object>" = pattern.type @"o";
1173 yield %15;
1174 }
1175 (%16 : java.type:"java.lang.Object")java.type:"void" -> {
1176 var.store %6 %16;
1177 yield;
1178 };
1179 yield %14;
1180 }
1181 ()java.type:"void" -> {
1182 %17 : java.type:"java.lang.String" = var.load %3;
1183 %18 : java.type:"java.lang.String" = constant @"obj";
1184 %19 : java.type:"java.lang.String" = concat %17 %18;
1185 var.store %3 %19;
1186 yield;
1187 };
1188 %20 : java.type:"java.lang.String" = var.load %3;
1189 return %20;
1190 };
1191 """)
1192 @CodeReflection
1193 static String enhancedSwStatUnconditionalPattern(String s) {
1194 String r = "";
1195 switch (s) {
1196 case "A" -> r += "A";
1197 case Object o -> r += "obj";
1198 }
1199 return r;
1200 }
1201
1202 @IR("""
1203 func @"casePatternRuleExpression" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1204 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1205 %2 : java.type:"java.lang.String" = constant @"";
1206 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1207 %4 : java.type:"java.lang.Object" = var.load %1;
1208 %5 : java.type:"java.lang.Integer" = constant @null;
1209 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1210 %7 : java.type:"java.lang.String" = constant @null;
1211 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1212 java.switch.statement %4
1213 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1214 %10 : java.type:"boolean" = pattern.match %9
1215 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1216 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1217 yield %11;
1218 }
1219 (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1220 var.store %6 %12;
1221 yield;
1222 };
1223 yield %10;
1224 }
1225 ()java.type:"void" -> {
1226 %13 : java.type:"java.lang.String" = var.load %3;
1227 %14 : java.type:"java.lang.String" = constant @"integer";
1228 %15 : java.type:"java.lang.String" = concat %13 %14;
1229 var.store %3 %15;
1230 yield;
1231 }
1232 (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1233 %17 : java.type:"boolean" = pattern.match %16
1234 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1235 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1236 yield %18;
1237 }
1238 (%19 : java.type:"java.lang.String")java.type:"void" -> {
1239 var.store %8 %19;
1240 yield;
1241 };
1242 yield %17;
1243 }
1244 ()java.type:"void" -> {
1245 %20 : java.type:"java.lang.String" = var.load %3;
1246 %21 : java.type:"java.lang.String" = constant @"string";
1247 %22 : java.type:"java.lang.String" = concat %20 %21;
1248 var.store %3 %22;
1249 yield;
1250 }
1251 ()java.type:"boolean" -> {
1252 %23 : java.type:"boolean" = constant @true;
1253 yield %23;
1254 }
1255 ()java.type:"void" -> {
1256 %24 : java.type:"java.lang.String" = var.load %3;
1257 %25 : java.type:"java.lang.String" = constant @"else";
1258 %26 : java.type:"java.lang.String" = concat %24 %25;
1259 var.store %3 %26;
1260 yield;
1261 };
1262 %27 : java.type:"java.lang.String" = var.load %3;
1263 return %27;
1264 };
1265 """)
1266 @CodeReflection
1267 private static String casePatternRuleExpression(Object o) {
1268 String r = "";
1269 switch (o) {
1270 case Integer i -> r += "integer";
1271 case String s -> r+= "string";
1272 default -> r+= "else";
1273 }
1274 return r;
1275 }
1276
1277 @IR("""
1278 func @"casePatternRuleBlock" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1279 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1280 %2 : java.type:"java.lang.String" = constant @"";
1281 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1282 %4 : java.type:"java.lang.Object" = var.load %1;
1283 %5 : java.type:"java.lang.Integer" = constant @null;
1284 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1285 %7 : java.type:"java.lang.String" = constant @null;
1286 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1287 java.switch.statement %4
1288 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1289 %10 : java.type:"boolean" = pattern.match %9
1290 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1291 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1292 yield %11;
1293 }
1294 (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1295 var.store %6 %12;
1296 yield;
1297 };
1298 yield %10;
1299 }
1300 ()java.type:"void" -> {
1301 %13 : java.type:"java.lang.String" = var.load %3;
1302 %14 : java.type:"java.lang.String" = constant @"integer";
1303 %15 : java.type:"java.lang.String" = concat %13 %14;
1304 var.store %3 %15;
1305 yield;
1306 }
1307 (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1308 %17 : java.type:"boolean" = pattern.match %16
1309 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1310 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1311 yield %18;
1312 }
1313 (%19 : java.type:"java.lang.String")java.type:"void" -> {
1314 var.store %8 %19;
1315 yield;
1316 };
1317 yield %17;
1318 }
1319 ()java.type:"void" -> {
1320 %20 : java.type:"java.lang.String" = var.load %3;
1321 %21 : java.type:"java.lang.String" = constant @"string";
1322 %22 : java.type:"java.lang.String" = concat %20 %21;
1323 var.store %3 %22;
1324 yield;
1325 }
1326 ()java.type:"boolean" -> {
1327 %23 : java.type:"boolean" = constant @true;
1328 yield %23;
1329 }
1330 ()java.type:"void" -> {
1331 %24 : java.type:"java.lang.String" = var.load %3;
1332 %25 : java.type:"java.lang.String" = constant @"else";
1333 %26 : java.type:"java.lang.String" = concat %24 %25;
1334 var.store %3 %26;
1335 yield;
1336 };
1337 %27 : java.type:"java.lang.String" = var.load %3;
1338 return %27;
1339 };
1340 """)
1341 @CodeReflection
1342 private static String casePatternRuleBlock(Object o) {
1343 String r = "";
1344 switch (o) {
1345 case Integer i -> {
1346 r += "integer";
1347 }
1348 case String s -> {
1349 r += "string";
1350 }
1351 default -> {
1352 r += "else";
1353 }
1354 }
1355 return r;
1356 }
1357
1358 @IR("""
1359 func @"casePatternStatement" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1360 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1361 %2 : java.type:"java.lang.String" = constant @"";
1362 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1363 %4 : java.type:"java.lang.Object" = var.load %1;
1364 %5 : java.type:"java.lang.Integer" = constant @null;
1365 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1366 %7 : java.type:"java.lang.String" = constant @null;
1367 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1368 java.switch.statement %4
1369 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1370 %10 : java.type:"boolean" = pattern.match %9
1371 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1372 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1373 yield %11;
1374 }
1375 (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1376 var.store %6 %12;
1377 yield;
1378 };
1379 yield %10;
1380 }
1381 ()java.type:"void" -> {
1382 %13 : java.type:"java.lang.String" = var.load %3;
1383 %14 : java.type:"java.lang.String" = constant @"integer";
1384 %15 : java.type:"java.lang.String" = concat %13 %14;
1385 var.store %3 %15;
1386 java.break;
1387 }
1388 (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1389 %17 : java.type:"boolean" = pattern.match %16
1390 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1391 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1392 yield %18;
1393 }
1394 (%19 : java.type:"java.lang.String")java.type:"void" -> {
1395 var.store %8 %19;
1396 yield;
1397 };
1398 yield %17;
1399 }
1400 ()java.type:"void" -> {
1401 %20 : java.type:"java.lang.String" = var.load %3;
1402 %21 : java.type:"java.lang.String" = constant @"string";
1403 %22 : java.type:"java.lang.String" = concat %20 %21;
1404 var.store %3 %22;
1405 java.break;
1406 }
1407 ()java.type:"boolean" -> {
1408 %23 : java.type:"boolean" = constant @true;
1409 yield %23;
1410 }
1411 ()java.type:"void" -> {
1412 %24 : java.type:"java.lang.String" = var.load %3;
1413 %25 : java.type:"java.lang.String" = constant @"else";
1414 %26 : java.type:"java.lang.String" = concat %24 %25;
1415 var.store %3 %26;
1416 yield;
1417 };
1418 %27 : java.type:"java.lang.String" = var.load %3;
1419 return %27;
1420 };
1421 """)
1422 @CodeReflection
1423 private static String casePatternStatement(Object o) {
1424 String r = "";
1425 switch (o) {
1426 case Integer i:
1427 r += "integer";
1428 break;
1429 case String s:
1430 r += "string";
1431 break;
1432 default:
1433 r += "else";
1434 }
1435 return r;
1436 }
1437
1438 @IR("""
1439 func @"casePatternThrow" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1440 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1441 %2 : java.type:"java.lang.String" = constant @"";
1442 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1443 %4 : java.type:"java.lang.Object" = var.load %1;
1444 %5 : java.type:"java.lang.Number" = constant @null;
1445 %6 : Var<java.type:"java.lang.Number"> = var %5 @"n";
1446 %7 : java.type:"java.lang.String" = constant @null;
1447 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1448 java.switch.statement %4
1449 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1450 %10 : java.type:"boolean" = pattern.match %9
1451 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" -> {
1452 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1453 yield %11;
1454 }
1455 (%12 : java.type:"java.lang.Number")java.type:"void" -> {
1456 var.store %6 %12;
1457 yield;
1458 };
1459 yield %10;
1460 }
1461 ()java.type:"void" -> {
1462 %13 : java.type:"java.lang.IllegalArgumentException" = new @java.ref:"java.lang.IllegalArgumentException::()";
1463 throw %13;
1464 }
1465 (%14 : java.type:"java.lang.Object")java.type:"boolean" -> {
1466 %15 : java.type:"boolean" = pattern.match %14
1467 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1468 %16 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1469 yield %16;
1470 }
1471 (%17 : java.type:"java.lang.String")java.type:"void" -> {
1472 var.store %8 %17;
1473 yield;
1474 };
1475 yield %15;
1476 }
1477 ()java.type:"void" -> {
1478 %18 : java.type:"java.lang.String" = var.load %3;
1479 %19 : java.type:"java.lang.String" = constant @"a string";
1480 %20 : java.type:"java.lang.String" = concat %18 %19;
1481 var.store %3 %20;
1482 yield;
1483 }
1484 ()java.type:"boolean" -> {
1485 %21 : java.type:"boolean" = constant @true;
1486 yield %21;
1487 }
1488 ()java.type:"void" -> {
1489 %22 : java.type:"java.lang.String" = var.load %3;
1490 %23 : java.type:"java.lang.Object" = var.load %1;
1491 %24 : java.type:"java.lang.Class<?>" = invoke %23 @java.ref:"java.lang.Object::getClass():java.lang.Class";
1492 %25 : java.type:"java.lang.String" = invoke %24 @java.ref:"java.lang.Class::getName():java.lang.String";
1493 %26 : java.type:"java.lang.String" = concat %22 %25;
1494 var.store %3 %26;
1495 yield;
1496 };
1497 %27 : java.type:"java.lang.String" = var.load %3;
1498 return %27;
1499 };
1500 """)
1501 @CodeReflection
1502 private static String casePatternThrow(Object o) {
1503 String r = "";
1504 switch (o) {
1505 case Number n -> throw new IllegalArgumentException();
1506 case String s -> r += "a string";
1507 default -> r += o.getClass().getName();
1508 }
1509 return r;
1510 }
1511
1512 // @@@ code model for such as code is not supported
1513 // @CodeReflection
1514 private static String casePatternMultiLabel(Object o) {
1515 String r = "";
1516 switch (o) {
1517 case Integer _, Long _, Character _, Byte _, Short _-> r += "integral type";
1518 default -> r += "non integral type";
1519 }
1520 return r;
1521 }
1522
1523 @IR("""
1524 func @"casePatternWithCaseConstant" (%0 : java.type:"java.lang.Integer")java.type:"java.lang.String" -> {
1525 %1 : Var<java.type:"java.lang.Integer"> = var %0 @"a";
1526 %2 : java.type:"java.lang.String" = constant @"";
1527 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1528 %4 : java.type:"java.lang.Integer" = var.load %1;
1529 %5 : java.type:"java.lang.Integer" = constant @null;
1530 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1531 %7 : java.type:"java.lang.Integer" = constant @null;
1532 %8 : Var<java.type:"java.lang.Integer"> = var %7 @"i";
1533 java.switch.statement %4
1534 (%9 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1535 %10 : java.type:"int" = constant @42;
1536 %11 : java.type:"java.lang.Integer" = invoke %10 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
1537 %12 : java.type:"boolean" = invoke %9 %11 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1538 yield %12;
1539 }
1540 ()java.type:"void" -> {
1541 %13 : java.type:"java.lang.String" = var.load %3;
1542 %14 : java.type:"java.lang.String" = constant @"forty two";
1543 %15 : java.type:"java.lang.String" = concat %13 %14;
1544 var.store %3 %15;
1545 yield;
1546 }
1547 (%16 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1548 %17 : java.type:"boolean" = java.cand
1549 ()java.type:"boolean" -> {
1550 %18 : java.type:"boolean" = pattern.match %16
1551 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1552 %19 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1553 yield %19;
1554 }
1555 (%20 : java.type:"java.lang.Integer")java.type:"void" -> {
1556 var.store %6 %20;
1557 yield;
1558 };
1559 yield %18;
1560 }
1561 ()java.type:"boolean" -> {
1562 %21 : java.type:"java.lang.Integer" = var.load %6;
1563 %22 : java.type:"int" = invoke %21 @java.ref:"java.lang.Integer::intValue():int";
1564 %23 : java.type:"int" = constant @0;
1565 %24 : java.type:"boolean" = gt %22 %23;
1566 yield %24;
1567 };
1568 yield %17;
1569 }
1570 ()java.type:"void" -> {
1571 %25 : java.type:"java.lang.String" = var.load %3;
1572 %26 : java.type:"java.lang.String" = constant @"positive int";
1573 %27 : java.type:"java.lang.String" = concat %25 %26;
1574 var.store %3 %27;
1575 yield;
1576 }
1577 (%28 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1578 %29 : java.type:"boolean" = java.cand
1579 ()java.type:"boolean" -> {
1580 %30 : java.type:"boolean" = pattern.match %28
1581 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1582 %31 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1583 yield %31;
1584 }
1585 (%32 : java.type:"java.lang.Integer")java.type:"void" -> {
1586 var.store %8 %32;
1587 yield;
1588 };
1589 yield %30;
1590 }
1591 ()java.type:"boolean" -> {
1592 %33 : java.type:"java.lang.Integer" = var.load %8;
1593 %34 : java.type:"int" = invoke %33 @java.ref:"java.lang.Integer::intValue():int";
1594 %35 : java.type:"int" = constant @0;
1595 %36 : java.type:"boolean" = lt %34 %35;
1596 yield %36;
1597 };
1598 yield %29;
1599 }
1600 ()java.type:"void" -> {
1601 %37 : java.type:"java.lang.String" = var.load %3;
1602 %38 : java.type:"java.lang.String" = constant @"negative int";
1603 %39 : java.type:"java.lang.String" = concat %37 %38;
1604 var.store %3 %39;
1605 yield;
1606 }
1607 ()java.type:"boolean" -> {
1608 %40 : java.type:"boolean" = constant @true;
1609 yield %40;
1610 }
1611 ()java.type:"void" -> {
1612 %41 : java.type:"java.lang.String" = var.load %3;
1613 %42 : java.type:"java.lang.String" = constant @"zero";
1614 %43 : java.type:"java.lang.String" = concat %41 %42;
1615 var.store %3 %43;
1616 yield;
1617 };
1618 %44 : java.type:"java.lang.String" = var.load %3;
1619 return %44;
1620 };
1621 """)
1622 @CodeReflection
1623 static String casePatternWithCaseConstant(Integer a) {
1624 String r = "";
1625 switch (a) {
1626 case 42 -> r += "forty two";
1627 // @@@ case int will not match, because of the way InstanceOfOp is interpreted
1628 case Integer i when i > 0 -> r += "positive int";
1629 case Integer i when i < 0 -> r += "negative int";
1630 default -> r += "zero";
1631 }
1632 return r;
1633 }
1634
1635 @IR("""
1636 func @"caseTypePattern" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1637 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1638 %2 : java.type:"java.lang.String" = constant @"";
1639 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1640 %4 : java.type:"java.lang.Object" = var.load %1;
1641 %5 : java.type:"java.lang.String" = constant @null;
1642 %6 : Var<java.type:"java.lang.String"> = var %5;
1643 %7 : java.type:"java.util.RandomAccess" = constant @null;
1644 %8 : Var<java.type:"java.util.RandomAccess"> = var %7;
1645 %9 : java.type:"int[]" = constant @null;
1646 %10 : Var<java.type:"int[]"> = var %9;
1647 %11 : java.type:"java.util.Stack[][]" = constant @null;
1648 %12 : Var<java.type:"java.util.Stack[][]"> = var %11;
1649 %13 : java.type:"java.util.Collection[][][]" = constant @null;
1650 %14 : Var<java.type:"java.util.Collection[][][]"> = var %13;
1651 %15 : java.type:"java.lang.Number" = constant @null;
1652 %16 : Var<java.type:"java.lang.Number"> = var %15 @"n";
1653 java.switch.statement %4
1654 (%17 : java.type:"java.lang.Object")java.type:"boolean" -> {
1655 %18 : java.type:"boolean" = pattern.match %17
1656 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1657 %19 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type;
1658 yield %19;
1659 }
1660 (%20 : java.type:"java.lang.String")java.type:"void" -> {
1661 var.store %6 %20;
1662 yield;
1663 };
1664 yield %18;
1665 }
1666 ()java.type:"void" -> {
1667 %21 : java.type:"java.lang.String" = var.load %3;
1668 %22 : java.type:"java.lang.String" = constant @"String";
1669 %23 : java.type:"java.lang.String" = concat %21 %22;
1670 var.store %3 %23;
1671 yield;
1672 }
1673 (%24 : java.type:"java.lang.Object")java.type:"boolean" -> {
1674 %25 : java.type:"boolean" = pattern.match %24
1675 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.RandomAccess>" -> {
1676 %26 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.RandomAccess>" = pattern.type;
1677 yield %26;
1678 }
1679 (%27 : java.type:"java.util.RandomAccess")java.type:"void" -> {
1680 var.store %8 %27;
1681 yield;
1682 };
1683 yield %25;
1684 }
1685 ()java.type:"void" -> {
1686 %28 : java.type:"java.lang.String" = var.load %3;
1687 %29 : java.type:"java.lang.String" = constant @"RandomAccess";
1688 %30 : java.type:"java.lang.String" = concat %28 %29;
1689 var.store %3 %30;
1690 yield;
1691 }
1692 (%31 : java.type:"java.lang.Object")java.type:"boolean" -> {
1693 %32 : java.type:"boolean" = pattern.match %31
1694 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<int[]>" -> {
1695 %33 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<int[]>" = pattern.type;
1696 yield %33;
1697 }
1698 (%34 : java.type:"int[]")java.type:"void" -> {
1699 var.store %10 %34;
1700 yield;
1701 };
1702 yield %32;
1703 }
1704 ()java.type:"void" -> {
1705 %35 : java.type:"java.lang.String" = var.load %3;
1706 %36 : java.type:"java.lang.String" = constant @"int[]";
1707 %37 : java.type:"java.lang.String" = concat %35 %36;
1708 var.store %3 %37;
1709 yield;
1710 }
1711 (%38 : java.type:"java.lang.Object")java.type:"boolean" -> {
1712 %39 : java.type:"boolean" = pattern.match %38
1713 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Stack[][]>" -> {
1714 %40 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Stack[][]>" = pattern.type;
1715 yield %40;
1716 }
1717 (%41 : java.type:"java.util.Stack[][]")java.type:"void" -> {
1718 var.store %12 %41;
1719 yield;
1720 };
1721 yield %39;
1722 }
1723 ()java.type:"void" -> {
1724 %42 : java.type:"java.lang.String" = var.load %3;
1725 %43 : java.type:"java.lang.String" = constant @"Stack[][]";
1726 %44 : java.type:"java.lang.String" = concat %42 %43;
1727 var.store %3 %44;
1728 yield;
1729 }
1730 (%45 : java.type:"java.lang.Object")java.type:"boolean" -> {
1731 %46 : java.type:"boolean" = pattern.match %45
1732 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Collection[][][]>" -> {
1733 %47 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Collection[][][]>" = pattern.type;
1734 yield %47;
1735 }
1736 (%48 : java.type:"java.util.Collection[][][]")java.type:"void" -> {
1737 var.store %14 %48;
1738 yield;
1739 };
1740 yield %46;
1741 }
1742 ()java.type:"void" -> {
1743 %49 : java.type:"java.lang.String" = var.load %3;
1744 %50 : java.type:"java.lang.String" = constant @"Collection[][][]";
1745 %51 : java.type:"java.lang.String" = concat %49 %50;
1746 var.store %3 %51;
1747 yield;
1748 }
1749 (%52 : java.type:"java.lang.Object")java.type:"boolean" -> {
1750 %53 : java.type:"boolean" = pattern.match %52
1751 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" -> {
1752 %54 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1753 yield %54;
1754 }
1755 (%55 : java.type:"java.lang.Number")java.type:"void" -> {
1756 var.store %16 %55;
1757 yield;
1758 };
1759 yield %53;
1760 }
1761 ()java.type:"void" -> {
1762 %56 : java.type:"java.lang.String" = var.load %3;
1763 %57 : java.type:"java.lang.String" = constant @"Number";
1764 %58 : java.type:"java.lang.String" = concat %56 %57;
1765 var.store %3 %58;
1766 yield;
1767 }
1768 ()java.type:"boolean" -> {
1769 %59 : java.type:"boolean" = constant @true;
1770 yield %59;
1771 }
1772 ()java.type:"void" -> {
1773 %60 : java.type:"java.lang.String" = var.load %3;
1774 %61 : java.type:"java.lang.String" = constant @"something else";
1775 %62 : java.type:"java.lang.String" = concat %60 %61;
1776 var.store %3 %62;
1777 yield;
1778 };
1779 %63 : java.type:"java.lang.String" = var.load %3;
1780 return %63;
1781 };
1782 """)
1783 @CodeReflection
1784 static String caseTypePattern(Object o) {
1785 String r = "";
1786 switch (o) {
1787 case String _ -> r+= "String"; // class
1788 case RandomAccess _ -> r+= "RandomAccess"; // interface
1789 case int[] _ -> r+= "int[]"; // array primitive
1790 case Stack[][] _ -> r+= "Stack[][]"; // array class
1791 case Collection[][][] _ -> r+= "Collection[][][]"; // array interface
1792 case final Number n -> r+= "Number"; // final modifier
1793 default -> r+= "something else";
1794 }
1795 return r;
1796 }
1797
1798 record R(Number n) {}
1799 @IR("""
1800 func @"caseRecordPattern" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1801 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1802 %2 : java.type:"java.lang.String" = constant @"";
1803 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1804 %4 : java.type:"java.lang.Object" = var.load %1;
1805 %5 : java.type:"java.lang.Number" = constant @null;
1806 %6 : Var<java.type:"java.lang.Number"> = var %5 @"n";
1807 java.switch.statement %4
1808 (%7 : java.type:"java.lang.Object")java.type:"boolean" -> {
1809 %8 : java.type:"boolean" = pattern.match %7
1810 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" -> {
1811 %9 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1812 %10 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" = pattern.record %9 @java.ref:"(java.lang.Number n)SwitchStatementTest$R";
1813 yield %10;
1814 }
1815 (%11 : java.type:"java.lang.Number")java.type:"void" -> {
1816 var.store %6 %11;
1817 yield;
1818 };
1819 yield %8;
1820 }
1821 ()java.type:"void" -> {
1822 %12 : java.type:"java.lang.String" = var.load %3;
1823 %13 : java.type:"java.lang.String" = constant @"R(_)";
1824 %14 : java.type:"java.lang.String" = concat %12 %13;
1825 var.store %3 %14;
1826 yield;
1827 }
1828 ()java.type:"boolean" -> {
1829 %15 : java.type:"boolean" = constant @true;
1830 yield %15;
1831 }
1832 ()java.type:"void" -> {
1833 %16 : java.type:"java.lang.String" = var.load %3;
1834 %17 : java.type:"java.lang.String" = constant @"else";
1835 %18 : java.type:"java.lang.String" = concat %16 %17;
1836 var.store %3 %18;
1837 yield;
1838 };
1839 %19 : java.type:"java.lang.String" = var.load %3;
1840 return %19;
1841 };
1842 """)
1843 @CodeReflection
1844 static String caseRecordPattern(Object o) {
1845 String r = "";
1846 switch (o) {
1847 case R(Number n) -> r += "R(_)";
1848 default -> r+= "else";
1849 }
1850 return r;
1851 }
1852
1853 @IR("""
1854 func @"casePatternGuard" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1855 %1 : Var<java.type:"java.lang.Object"> = var %0 @"obj";
1856 %2 : java.type:"java.lang.String" = constant @"";
1857 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1858 %4 : java.type:"java.lang.Object" = var.load %1;
1859 %5 : java.type:"java.lang.String" = constant @null;
1860 %6 : Var<java.type:"java.lang.String"> = var %5 @"s";
1861 %7 : java.type:"java.lang.Number" = constant @null;
1862 %8 : Var<java.type:"java.lang.Number"> = var %7 @"n";
1863 java.switch.statement %4
1864 (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1865 %10 : java.type:"boolean" = java.cand
1866 ()java.type:"boolean" -> {
1867 %11 : java.type:"boolean" = pattern.match %9
1868 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1869 %12 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1870 yield %12;
1871 }
1872 (%13 : java.type:"java.lang.String")java.type:"void" -> {
1873 var.store %6 %13;
1874 yield;
1875 };
1876 yield %11;
1877 }
1878 ()java.type:"boolean" -> {
1879 %14 : java.type:"java.lang.String" = var.load %6;
1880 %15 : java.type:"int" = invoke %14 @java.ref:"java.lang.String::length():int";
1881 %16 : java.type:"int" = constant @3;
1882 %17 : java.type:"boolean" = gt %15 %16;
1883 yield %17;
1884 };
1885 yield %10;
1886 }
1887 ()java.type:"void" -> {
1888 %18 : java.type:"java.lang.String" = var.load %3;
1889 %19 : java.type:"java.lang.String" = constant @"str with length > %d";
1890 %20 : java.type:"java.lang.String" = var.load %6;
1891 %21 : java.type:"int" = invoke %20 @java.ref:"java.lang.String::length():int";
1892 %22 : java.type:"java.lang.Integer" = invoke %21 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
1893 %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;
1894 %24 : java.type:"java.lang.String" = concat %18 %23;
1895 var.store %3 %24;
1896 yield;
1897 }
1898 (%25 : java.type:"java.lang.Object")java.type:"boolean" -> {
1899 %26 : java.type:"boolean" = java.cand
1900 ()java.type:"boolean" -> {
1901 %27 : java.type:"boolean" = pattern.match %25
1902 ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" -> {
1903 %28 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1904 %29 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" = pattern.record %28 @java.ref:"(java.lang.Number n)SwitchStatementTest$R";
1905 yield %29;
1906 }
1907 (%30 : java.type:"java.lang.Number")java.type:"void" -> {
1908 var.store %8 %30;
1909 yield;
1910 };
1911 yield %27;
1912 }
1913 ()java.type:"boolean" -> {
1914 %31 : java.type:"java.lang.Number" = var.load %8;
1915 %32 : java.type:"java.lang.Class<?>" = invoke %31 @java.ref:"java.lang.Object::getClass():java.lang.Class";
1916 %33 : java.type:"java.lang.Class" = constant @java.type:"java.lang.Double";
1917 %34 : java.type:"boolean" = invoke %32 %33 @java.ref:"java.lang.Object::equals(java.lang.Object):boolean";
1918 yield %34;
1919 };
1920 yield %26;
1921 }
1922 ()java.type:"void" -> {
1923 %35 : java.type:"java.lang.String" = var.load %3;
1924 %36 : java.type:"java.lang.String" = constant @"R(Double)";
1925 %37 : java.type:"java.lang.String" = concat %35 %36;
1926 var.store %3 %37;
1927 yield;
1928 }
1929 ()java.type:"boolean" -> {
1930 %38 : java.type:"boolean" = constant @true;
1931 yield %38;
1932 }
1933 ()java.type:"void" -> {
1934 %39 : java.type:"java.lang.String" = var.load %3;
1935 %40 : java.type:"java.lang.String" = constant @"else";
1936 %41 : java.type:"java.lang.String" = concat %39 %40;
1937 var.store %3 %41;
1938 yield;
1939 };
1940 %42 : java.type:"java.lang.String" = var.load %3;
1941 return %42;
1942 };
1943 """)
1944 @CodeReflection
1945 static String casePatternGuard(Object obj) {
1946 String r = "";
1947 switch (obj) {
1948 case String s when s.length() > 3 -> r += "str with length > %d".formatted(s.length());
1949 case R(Number n) when n.getClass().equals(Double.class) -> r += "R(Double)";
1950 default -> r += "else";
1951 }
1952 return r;
1953 }
1954
1955 @IR("""
1956 func @"defaultCaseNotTheLast" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
1957 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
1958 %2 : java.type:"java.lang.String" = constant @"";
1959 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1960 %4 : java.type:"java.lang.String" = var.load %1;
1961 java.switch.statement %4
1962 (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
1963 %6 : java.type:"java.lang.String" = constant @"M";
1964 %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1965 yield %7;
1966 }
1967 ()java.type:"void" -> {
1968 %8 : java.type:"java.lang.String" = var.load %3;
1969 %9 : java.type:"java.lang.String" = constant @"Mow";
1970 %10 : java.type:"java.lang.String" = concat %8 %9;
1971 var.store %3 %10;
1972 yield;
1973 }
1974 (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
1975 %12 : java.type:"java.lang.String" = constant @"A";
1976 %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1977 yield %13;
1978 }
1979 ()java.type:"void" -> {
1980 %14 : java.type:"java.lang.String" = var.load %3;
1981 %15 : java.type:"java.lang.String" = constant @"Aow";
1982 %16 : java.type:"java.lang.String" = concat %14 %15;
1983 var.store %3 %16;
1984 yield;
1985 }
1986 ()java.type:"boolean" -> {
1987 %17 : java.type:"boolean" = constant @true;
1988 yield %17;
1989 }
1990 ()java.type:"void" -> {
1991 %18 : java.type:"java.lang.String" = var.load %3;
1992 %19 : java.type:"java.lang.String" = constant @"else";
1993 %20 : java.type:"java.lang.String" = concat %18 %19;
1994 var.store %3 %20;
1995 yield;
1996 };
1997 %21 : java.type:"java.lang.String" = var.load %3;
1998 return %21;
1999 };
2000 """)
2001 @CodeReflection
2002 static String defaultCaseNotTheLast(String s) {
2003 String r = "";
2004 switch (s) {
2005 default -> r += "else";
2006 case "M" -> r += "Mow";
2007 case "A" -> r += "Aow";
2008 }
2009 return r;
2010 }
2011
2012 @IR("""
2013 func @"f" (%0 : java.type:"int")java.type:"int" -> {
2014 %1 : Var<java.type:"int"> = var %0 @"i";
2015 %2 : java.type:"int" = var.load %1;
2016 java.switch.statement %2
2017 (%3 : java.type:"int")java.type:"boolean" -> {
2018 %4 : java.type:"int" = constant @0;
2019 %5 : java.type:"boolean" = eq %3 %4;
2020 yield %5;
2021 }
2022 ()java.type:"void" -> {
2023 %6 : java.type:"int" = constant @0;
2024 return %6;
2025 };
2026 %7 : java.type:"int" = constant @0;
2027 return %7;
2028 };
2029 """)
2030 @CodeReflection
2031 static int f(int i) {
2032 switch (i) {
2033 case 0 -> {
2034 return 0;
2035 }
2036 }
2037 return 0;
2038 }
2039 }