/* * 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; } } }