/*
 * @test /nodynamiccopyright/
 * @bug 8231827
 * @summary Basic pattern bindings scope test
 * @compile/fail/ref=MatchBindingScopeTest.out -XDrawDiagnostics MatchBindingScopeTest.java
 */
public class MatchBindingScopeTest {

    static Integer i = 42;
    static String s = "Hello";
    static Object o1 = s;
    static Object o2 = i;

    public static void meth() {

        if (o1 instanceof String j && j.length() == 5) { // OK
            System.out.println(j); // OK
        } else {
            System.out.println(j); // NOT OK
        }

        // NOT OK, name reused.
        if (o1 instanceof String j && o2 instanceof Integer j) {
        }

        if (o1 instanceof String j && j.length() == 5 && o2 instanceof Integer k && k == 42) { // OK
            System.out.println(j); // OK
            System.out.println(k); // OK
        } else {
            System.out.println(j); // NOT OK
            System.out.println(k); // NOT OK
        }

        if (o1 instanceof String j || j.length() == 5) { // NOT OK
            System.out.println(j); // NOT OK
        }

        if (o1 instanceof String j || o2 instanceof Integer j) { // NOT OK, types differ
            System.out.println(j);
        } else {
            System.out.println(j); // NOT OK.
        }

        while (o1 instanceof String j && j.length() == 5) { // OK
            System.out.println(j); // OK
        }

        while (o1 instanceof String j || true) {
            System.out.println(j); // Not OK
        }

        for (; o1 instanceof String j; j.length()) { // OK
            System.out.println(j); // OK
        }

        for (; o1 instanceof String j || true; j.length()) { // NOT OK
            System.out.println(j); // Not OK
        }

        int x = o1 instanceof String j ?
                      j.length() : // OK.
                      j.length();  // NOT OK.

        x = !(o1 instanceof String j) ?
                      j.length() : // NOT OK.
                      j.length();  // OK.
    }
}
