1+ /*
2+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
3+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+ *
5+ * This code is free software; you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 2 only, as
7+ * published by the Free Software Foundation.
8+ *
9+ * This code is distributed in the hope that it will be useful, but WITHOUT
10+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+ * version 2 for more details (a copy is included in the LICENSE file that
13+ * accompanied this code).
14+ *
15+ * You should have received a copy of the GNU General Public License version
16+ * 2 along with this work; if not, write to the Free Software Foundation,
17+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+ *
19+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+ * or visit www.oracle.com if you need additional information or have any
21+ * questions.
22+ */
23+ /**
24+ * @test
25+ * @bug 8314226
26+ * @summary Series of colon-style fallthrough switch cases with guards compiled incorrectly
27+ * @enablePreview
28+ * @compile T8314226.java
29+ * @run main T8314226
30+ */
31+
32+ public class T8314226 {
33+ int multipleGuardedCases (Object obj ) {
34+ switch (obj ) {
35+ case Integer _ when ((Integer ) obj ) > 0 :
36+ case String _ when !((String ) obj ).isEmpty ():
37+ return 1 ;
38+ default :
39+ return -1 ;
40+ }
41+ }
42+
43+ int multipleGuardedCases2a (Object obj ) {
44+ switch (obj ) {
45+ case Integer _ when ((Integer ) obj ) > 0 :
46+ case Float _ when ((Float ) obj ) > 0.0f :
47+ case String _ when !((String ) obj ).isEmpty ():
48+ return 1 ;
49+ default :
50+ return -1 ;
51+ }
52+ }
53+
54+ int multipleGuardedCases2b (Object obj ) {
55+ switch (obj ) {
56+ case Float _ when ((Float ) obj ) > 0.0f : // reversing the order
57+ case Integer _ when ((Integer ) obj ) > 0 :
58+ case String _ when !((String ) obj ).isEmpty ():
59+ return 1 ;
60+ default :
61+ return -1 ;
62+ }
63+ }
64+
65+ int multipleGuardedCasesMultiplePatterns (Object obj ) {
66+ switch (obj ) {
67+ case String _ when !((String ) obj ).isEmpty ():
68+ case Integer _ , Byte _ when ((Number ) obj ).intValue () > 0 :
69+ return 1 ;
70+ default :
71+ return -1 ;
72+ }
73+ }
74+
75+ int singleGuardedCase (Object obj ) {
76+ switch (obj ) {
77+ case String _ when !((String ) obj ).isEmpty ():
78+ return 1 ;
79+ default :
80+ return -1 ;
81+ }
82+ }
83+
84+ int multipleCasesWithReturn (Object obj ) {
85+ switch (obj ) {
86+ case Integer _ when ((Integer ) obj ) > 0 :
87+ case String _ when !((String ) obj ).isEmpty ():
88+ return 1 ;
89+ case null :
90+ return 2 ;
91+ default :
92+ return 3 ;
93+ }
94+ }
95+
96+ int multipleCasesWithEffectNoReturn (Object obj ) {
97+ int i = 0 ;
98+ switch (obj ) {
99+ case Integer _ when ((Integer ) obj ) > 0 :
100+ case String _ when !((String ) obj ).isEmpty ():
101+ i = i + 1 ;
102+ case null :
103+ i = i + 10 ;
104+ default :
105+ i = i + 100 ;
106+ }
107+ return i ;
108+ }
109+
110+ int multipleCasesWithLoop (Object obj ) {
111+ int i = 0 ;
112+ switch (obj ) {
113+ case Integer _ when ((Integer ) obj ) > 0 :
114+ case String _ when !((String ) obj ).isEmpty ():
115+ i = i + 1 ;
116+ case null :
117+ while (true ) {
118+ i = i + 10 ;
119+ break ;
120+ }
121+ default :
122+ i = i + 100 ;
123+ }
124+
125+ return i ;
126+ }
127+
128+ public static void main (String [] args ) {
129+ new T8314226 ().run ();
130+ }
131+
132+ private void run () {
133+ assertEquals (1 , multipleGuardedCases (42 ));
134+ assertEquals (1 , multipleGuardedCases ("test" ));
135+ assertEquals (-1 , multipleGuardedCases ("" ));
136+ assertEquals (1 , multipleGuardedCases2a (42.0f ));
137+ assertEquals (1 , multipleGuardedCases2a ("test" ));
138+ assertEquals (-1 , multipleGuardedCases2a ("" ));
139+ assertEquals (1 , multipleGuardedCases2b (42.0f ));
140+ assertEquals (1 , multipleGuardedCases2b ("test" ));
141+ assertEquals (-1 , multipleGuardedCases2b ("" ));
142+ assertEquals (1 , multipleGuardedCasesMultiplePatterns ((byte ) 42 ));
143+ assertEquals (1 , multipleGuardedCasesMultiplePatterns ("test" ));
144+ assertEquals (-1 , multipleGuardedCasesMultiplePatterns ("" ));
145+ assertEquals (-1 , singleGuardedCase (42 ));
146+ assertEquals (1 , singleGuardedCase ("test" ));
147+ assertEquals (-1 , singleGuardedCase ("" ));
148+ assertEquals (1 , multipleCasesWithReturn (42 ));
149+ assertEquals (1 , multipleCasesWithReturn ("test" ));
150+ assertEquals (2 , multipleCasesWithReturn (null ));
151+ assertEquals (3 , multipleCasesWithReturn ("" ));
152+ assertEquals (111 , multipleCasesWithEffectNoReturn (42 ));
153+ assertEquals (111 , multipleCasesWithEffectNoReturn ("test" ));
154+ assertEquals (110 , multipleCasesWithEffectNoReturn (null ));
155+ assertEquals (100 , multipleCasesWithEffectNoReturn ("" ));
156+ assertEquals (111 , multipleCasesWithLoop (42 ));
157+ assertEquals (111 , multipleCasesWithLoop ("test" ));
158+ assertEquals (110 , multipleCasesWithLoop (null ));
159+ assertEquals (100 , multipleCasesWithLoop ("" ));
160+ }
161+
162+ void assertEquals (Object expected , Object actual ) {
163+ if (expected != actual ) {
164+ throw new AssertionError ("Expected: " + expected + ", but got: " + actual );
165+ }
166+ }
167+ }
0 commit comments