| /* | |
| * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| /* | |
| * @test | |
| * @bug 8231827 | |
| * @summary Basic tests for bindings from instanceof | |
| * @compile BindingsTest1.java | |
| * @run main BindingsTest1 | |
| */ | |
| public class BindingsTest1 { | |
| public static boolean Ktrue() { return true; } | |
| public static void main(String[] args) { | |
| Object o1 = "hello"; | |
| Integer i = 42; | |
| Object o2 = i; | |
| Object o3 = "there"; | |
| // Test for (e matches P).T = { binding variables in P } | |
| if (o1 instanceof String s) { | |
| s.length(); | |
| } | |
| // Test for e1 && e2.T = union(e1.T, e2.T) | |
| if (o1 instanceof String s && o2 instanceof Integer in) { | |
| s.length(); | |
| in.intValue(); | |
| } | |
| // test for e1&&e2 - include e1.T in e2 | |
| if (o1 instanceof String s && s.length()>0) { | |
| System.out.print("done"); | |
| } | |
| // Test for (e1 || e2).F = union(e1.F, e2.F) | |
| if (!(o1 instanceof String s) || !(o3 instanceof Integer in)){ | |
| } else { | |
| s.length(); | |
| i.intValue(); | |
| } | |
| // Test for e1||e2 - include e1.F in e2 | |
| if (!(o1 instanceof String s) || s.length()>0) { | |
| System.out.println("done"); | |
| } | |
| // Test for e1 ? e2: e3 - include e1.T in e2 | |
| if (o1 instanceof String s ? s.length()>0 : false) { | |
| System.out.println("done"); | |
| } | |
| // Test for e1 ? e2 : e3 - include e1.F in e3 | |
| if (!(o1 instanceof String s) ? false : s.length()>0){ | |
| System.out.println("done"); | |
| } | |
| // Test for (!e).T = e.F | |
| if (!(!(o1 instanceof String s) || !(o3 instanceof Integer in))){ | |
| s.length(); | |
| i.intValue(); | |
| } | |
| // Test for (!e).F = e.T | |
| if (!(o1 instanceof String s)) { | |
| } else { | |
| s.length(); | |
| } | |
| L1: { | |
| if (o1 instanceof String s) { | |
| s.length(); | |
| } else { | |
| break L1; | |
| } | |
| s.length(); | |
| } | |
| L2: { | |
| if (!(o1 instanceof String s)) { | |
| break L2; | |
| } else { | |
| s.length(); | |
| } | |
| s.length(); | |
| } | |
| L4: { | |
| if (!(o1 instanceof String s)) { | |
| break L4; | |
| } | |
| s.length(); | |
| } | |
| { | |
| while (!(o1 instanceof String s)) { | |
| } | |
| s.length(); | |
| } | |
| L5: { | |
| while (!(o1 instanceof String s)) { | |
| } | |
| s.length(); | |
| } | |
| { | |
| L6: for ( ;!(o1 instanceof String s); ) { | |
| } | |
| s.length(); | |
| } | |
| { | |
| L7: do { | |
| } while (!(o1 instanceof String s)); | |
| s.length(); | |
| } | |
| { | |
| while (!(o1 instanceof String s)) { | |
| L8: break L8; | |
| } | |
| s.length(); | |
| } | |
| { | |
| for ( ;!(o1 instanceof String s); ) { | |
| L9: break L9; | |
| } | |
| s.length(); | |
| } | |
| { | |
| do { | |
| L10: break L10; | |
| } while (!(o1 instanceof String s)); | |
| s.length(); | |
| } | |
| if (o1 instanceof String s) { | |
| Runnable r1 = new Runnable() { | |
| @Override | |
| public void run() { | |
| s.length(); | |
| } | |
| }; | |
| r1.run(); | |
| Runnable r2 = () -> { | |
| s.length(); | |
| }; | |
| r2.run(); | |
| String s2 = s; | |
| } | |
| if (o1 instanceof final String s) { | |
| Runnable r1 = new Runnable() { | |
| @Override | |
| public void run() { | |
| s.length(); | |
| } | |
| }; | |
| r1.run(); | |
| Runnable r2 = () -> { | |
| s.length(); | |
| }; | |
| r2.run(); | |
| String s2 = s; | |
| } | |
| boolean result = (o1 instanceof String a1) ? (o1 instanceof String a2) : (!(o1 instanceof String a3)); | |
| boolean result2 = (o1 instanceof String a1) ? (o1 instanceof String a2) : (!(switch (0) { default -> false; })); | |
| //binding in an expression lambda: | |
| if (!((VoidPredicate) () -> o1 instanceof String str && !str.isEmpty()).get()) { | |
| throw new AssertionError(); | |
| } | |
| //binding in an block lambda: | |
| if (!((VoidPredicate) () -> o1 instanceof String str && !str.isEmpty()).get()) { | |
| throw new AssertionError(); | |
| } | |
| //binding in an anonymous class: | |
| if (!new VoidPredicate() { public boolean get() { return o1 instanceof String str && !str.isEmpty();} }.get()) { | |
| throw new AssertionError(); | |
| } | |
| if (!switch (i) { | |
| default: | |
| if (!(o1 instanceof String str)) { | |
| yield false; | |
| } | |
| if (str.isEmpty()) { | |
| yield true; | |
| } | |
| yield true; | |
| }) { | |
| throw new AssertionError(); | |
| } | |
| { | |
| L: { | |
| while (!(o1 instanceof String s)) { | |
| break L; | |
| } | |
| s.length(); | |
| } | |
| } | |
| { | |
| L: { | |
| for (; !(o1 instanceof String s); ) { | |
| break L; | |
| } | |
| s.length(); | |
| } | |
| } | |
| { | |
| int j = 0; | |
| L: while (j++ < 2) | |
| if (!(o1 instanceof String s)) { | |
| break L; | |
| } | |
| } | |
| { | |
| int j = 0; | |
| L: for (; j++ < 2; ) | |
| if (!(o1 instanceof String s)) { | |
| break L; | |
| } | |
| } | |
| { | |
| //"s" in the outter scope does not flow out of the if, but | |
| //variables inside a lambda or anonymous or local class may: | |
| L: if (!(o1 instanceof String s)) { | |
| Runnable r = () -> { | |
| NESTED: { | |
| if (!(o1 instanceof String n)) { | |
| break NESTED; | |
| } | |
| n.length(); | |
| } | |
| }; | |
| break L; | |
| } | |
| } | |
| switch (0) { | |
| case 0: | |
| if (!(o1 instanceof String s)) { | |
| break; | |
| } | |
| s.length(); | |
| } | |
| //binding in an anonymous class: | |
| if (!(invokeOnce("") instanceof String s)) { | |
| throw new AssertionError(); | |
| } | |
| System.out.println("BindingsTest1 complete"); | |
| } | |
| interface VoidPredicate { | |
| public boolean get(); | |
| } | |
| static boolean id(boolean b) { | |
| return b; | |
| } | |
| private static boolean invoked; | |
| static Object invokeOnce(Object val) { | |
| if (invoked) { | |
| throw new IllegalStateException(); | |
| } else { | |
| invoked = true; | |
| return val; | |
| } | |
| } | |
| } |