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 }