1 /* 2 * Copyright (c) 2018, 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 /** 25 * @test 26 * @bug 8214031 27 * @summary Verify that definite assignment when true works (legal code) 28 * @compile --enable-preview --source 13 DefiniteAssignment1.java 29 * @run main/othervm --enable-preview DefiniteAssignment1 30 */ 31 public class DefiniteAssignment1 { 32 public static void main(String[] args) { 33 int a = 0; 34 boolean b = true; 35 36 { 37 int x; 38 39 boolean t1 = (b && switch(a) { 40 case 0: break (x = 1) == 1 || true; 41 default: break false; 42 }) && x == 1; //x is definitelly assigned here 43 44 if (!t1) { 45 throw new IllegalStateException("Unexpected result."); 46 } 47 } 48 49 { 50 int x; 51 52 boolean t1 = (b && switch(a) { 53 case 0: break (x = 1) == 1 || isTrue(); 54 default: break false; 55 }) && x == 1; //x is definitelly assigned here 56 57 if (!t1) { 58 throw new IllegalStateException("Unexpected result."); 59 } 60 } 61 62 { 63 int x; 64 65 boolean t1a = (b && switch(a) { 66 case 0: break (x = 1) == 1; 67 default: break false; 68 }) && x == 1; //x is definitelly assigned here 69 70 if (!t1a) { 71 throw new IllegalStateException("Unexpected result."); 72 } 73 } 74 75 { 76 int x; 77 78 boolean t1b = (switch(a) { 79 case 0: break (x = 1) == 1; 80 default: break false; 81 }) && x == 1; //x is definitelly assigned here 82 83 if (!t1b) { 84 throw new IllegalStateException("Unexpected result."); 85 } 86 } 87 88 { 89 int x; 90 91 boolean t2 = !(b && switch(a) { 92 case 0: break (x = 1) == 1 || true; 93 default: break false; 94 }) || x == 1; 95 96 if (!t2) { 97 throw new IllegalStateException("Unexpected result."); 98 } 99 } 100 101 { 102 int x; 103 104 boolean t2 = !(b && switch(a) { 105 case 0: break (x = 1) == 1 || isTrue(); 106 default: break false; 107 }) || x == 1; 108 109 if (!t2) { 110 throw new IllegalStateException("Unexpected result."); 111 } 112 } 113 114 { 115 int x; 116 117 boolean t3 = !(switch(a) { 118 case 0: break (x = 1) == 1 || true; 119 default: break false; 120 }) || x == 2; 121 122 if (t3) { 123 throw new IllegalStateException("Unexpected result."); 124 } 125 } 126 127 { 128 int x; 129 130 boolean t3 = !(switch(a) { 131 case 0: break (x = 1) == 1 || isTrue(); 132 default: break false; 133 }) || x == 2; 134 135 if (t3) { 136 throw new IllegalStateException("Unexpected result."); 137 } 138 } 139 140 { 141 int x; 142 143 boolean t4 = (b && switch(a) { 144 case 0: break (x = 1) == 1 || true; 145 default: throw new IllegalStateException(); 146 }) && x == 1; //x is definitelly assigned here 147 148 if (!t4) { 149 throw new IllegalStateException("Unexpected result."); 150 } 151 } 152 153 154 { 155 int x; 156 157 boolean t4 = (b && switch(a) { 158 case 0: break (x = 1) == 1 || isTrue(); 159 default: throw new IllegalStateException(); 160 }) && x == 1; //x is definitelly assigned here 161 162 if (!t4) { 163 throw new IllegalStateException("Unexpected result."); 164 } 165 } 166 167 { 168 int x; 169 170 String s = "a"; 171 172 boolean t5 = (switch(s) { 173 case "a": break (x = 1) == 1 || true; 174 default: break false; 175 }) && x == 1; //x is definitelly assigned here 176 177 if (!t5) { 178 throw new IllegalStateException("Unexpected result."); 179 } 180 } 181 182 { 183 int x; 184 185 String s = "a"; 186 187 boolean t5 = (switch(s) { 188 case "a": break (x = 1) == 1 || isTrue(); 189 default: break false; 190 }) && x == 1; //x is definitelly assigned here 191 192 if (!t5) { 193 throw new IllegalStateException("Unexpected result."); 194 } 195 } 196 197 { 198 int x; 199 E e = E.B; 200 201 boolean t6 = (switch(e) { 202 case B: break (x = 1) == 1 || true; 203 default: break false; 204 }) && x == 1; //x is definitelly assigned here 205 206 if (!t6) { 207 throw new IllegalStateException("Unexpected result."); 208 } 209 } 210 211 { 212 int x; 213 E e = E.B; 214 215 boolean t6 = (switch(e) { 216 case B: break (x = 1) == 1 || isTrue(); 217 default: break false; 218 }) && x == 1; //x is definitelly assigned here 219 220 if (!t6) { 221 throw new IllegalStateException("Unexpected result."); 222 } 223 } 224 225 { 226 int x; 227 228 int t7 = new DefiniteAssignment1().id(switch(0) { 229 default -> true; 230 } && (x = 1) == 1 && x == 1 ? 2 : -1); 231 232 if (t7 != 2) { 233 throw new IllegalStateException("Unexpected result."); 234 } 235 } 236 237 { 238 int x; 239 240 int t7 = new DefiniteAssignment1().id(switch(0) { 241 default -> isTrue(); 242 } && (x = 1) == 1 && x == 1 ? 2 : -1); 243 244 if (t7 != 2) { 245 throw new IllegalStateException("Unexpected result."); 246 } 247 } 248 249 { 250 int x; 251 E e = E.B; 252 253 boolean t8 = (switch(e) { 254 case A: x = 1; break true; 255 case B: break (x = 1) == 1 || true; 256 default: break false; 257 }) && x == 1; //x is definitelly assigned here 258 259 if (!t8) { 260 throw new IllegalStateException("Unexpected result."); 261 } 262 } 263 264 { 265 int x; 266 E e = E.B; 267 268 boolean t8 = (switch(e) { 269 case A: x = 1; break isTrue(); 270 case B: break (x = 1) == 1 || isTrue(); 271 default: break false; 272 }) && x == 1; //x is definitelly assigned here 273 274 if (!t8) { 275 throw new IllegalStateException("Unexpected result."); 276 } 277 } 278 279 { 280 int x; 281 E e = E.A; 282 283 boolean t9 = (switch(e) { 284 case A: x = 1; break true; 285 case B: break (x = 1) == 1 || true; 286 default: break false; 287 }) && x == 1; //x is definitelly assigned here 288 289 if (!t9) { 290 throw new IllegalStateException("Unexpected result."); 291 } 292 } 293 294 { 295 int x; 296 E e = E.A; 297 298 boolean t9 = (switch(e) { 299 case A: x = 1; break isTrue(); 300 case B: break (x = 1) == 1 || isTrue(); 301 default: break false; 302 }) && x == 1; //x is definitelly assigned here 303 304 if (!t9) { 305 throw new IllegalStateException("Unexpected result."); 306 } 307 } 308 309 { 310 int x; 311 E e = E.C; 312 313 boolean tA = (switch(e) { 314 case A: x = 1; break true; 315 case B: break (x = 1) == 1 || true; 316 default: break false; 317 }) && x == 1; //x is definitelly assigned here 318 319 if (tA) { 320 throw new IllegalStateException("Unexpected result."); 321 } 322 } 323 324 { 325 int x; 326 E e = E.C; 327 328 boolean tA = (switch(e) { 329 case A: x = 1; break isTrue(); 330 case B: break (x = 1) == 1 || isTrue(); 331 default: break false; 332 }) && x == 1; //x is definitelly assigned here 333 334 if (tA) { 335 throw new IllegalStateException("Unexpected result."); 336 } 337 } 338 339 { 340 final int x; 341 E e = E.C; 342 343 boolean tA = (switch(e) { 344 case A: x = 1; break true; 345 case B: break (x = 2) == 2 || true; 346 default: break false; 347 }) || (x = 3) == 3; //x is definitelly unassigned here 348 349 if (x != 3) { 350 throw new IllegalStateException("Unexpected result."); 351 } 352 } 353 354 { 355 int x; 356 E e = E.A; 357 358 boolean tA = (switch(e) { 359 case A: break isTrue() && (x = 1) == 1; 360 case B: break (x = 1) == 1 || isTrue(); 361 default: break false; 362 }) && x == 1; //x is definitelly assigned here 363 364 if (!tA) { 365 throw new IllegalStateException("Unexpected result."); 366 } 367 } 368 369 { 370 int x; 371 E e = E.A; 372 373 boolean tA = (switch(e) { 374 case A: break isTrue() && e != E.C ? (x = 1) == 1 && e != E.B : false; 375 case B: break (x = 1) == 1 || true; 376 default: break false; 377 }) && x == 1; //x is definitelly assigned here 378 379 if (!tA) { 380 throw new IllegalStateException("Unexpected result."); 381 } 382 } 383 384 { 385 int x; 386 E e = E.A; 387 388 boolean tA = (switch(e) { 389 case A: break isTrue() && e != E.C ? (x = 1) == 1 && e != E.B : false; 390 case B: break (x = 1) == 1 || isTrue(); 391 default: break false; 392 }) && x == 1; //x is definitelly assigned here 393 394 if (!tA) { 395 throw new IllegalStateException("Unexpected result."); 396 } 397 } 398 } 399 400 private int id(int v) { 401 return v; 402 } 403 404 private static boolean isTrue() { 405 return true; 406 } 407 408 enum E { 409 A, B, C; 410 } 411 }