/*
 * @test /nodynamiccopyright/
 * @bug 7196163
 * @summary Twr with different kinds of variables: local, instance, class, array component, parameter
 * @compile/fail/ref=TwrVarKinds.out -XDrawDiagnostics TwrVarKinds.java
 */

public class TwrVarKinds implements AutoCloseable {

    final static TwrVarKinds r1 = new TwrVarKinds();
    final TwrVarKinds r2 = new TwrVarKinds();
    static TwrVarKinds r3 = new TwrVarKinds();
    TwrVarKinds r4 = new TwrVarKinds();

    public static void meth() {

        TwrVarKinds r5 = new TwrVarKinds();

        /* static final field - ok */
        try (r1) {
        }

        /* non-static final field - ok */
        try (r1.r2) {
        }

        /* static non-final field - wrong */
        try (r3) {
            fail("Static non-final field is not allowed");
        }

        /* non-static non-final field - wrong */
        try (r1.r4) {
            fail("Non-static non-final field is not allowed");
        }

        /* local variable - covered by TwrForVariable1 test */

        /* array components - covered by TwrForVariable2 test */

        /* method parameter - ok */
        method(r5);

        /* constructor parameter - ok */
        TwrVarKinds r6 = new TwrVarKinds(r5);

        /* lambda parameter - covered by TwrAndLambda */

        /* exception parameter - ok */
        try {
            throw new ResourceException();
        } catch (ResourceException e) {
            try (e) {
            }
        }
    }

    public TwrVarKinds() {
    }

    public TwrVarKinds(TwrVarKinds r) {
        try (r) {
        }
    }

    static void method(TwrVarKinds r) {
        /* parameter */
        try (r) {
        }
    }

    static void fail(String reason) {
        throw new RuntimeException(reason);
    }

    public void close() {}

    static class ResourceException extends Exception implements AutoCloseable {
        public void close() {}
    }
}
