/**
 * @test  /nodynamiccopyright/
 * @bug 4216683 4346296 4656556 4785453 8164073
 * @summary New rules for when deprecation messages are suppressed
 * @author gafter
 *
 * @compile/ref=SuppressDeprecation.out -Xlint:deprecation -XDrawDiagnostics SuppressDeprecation.java
 * @compile/ref=SuppressDeprecation8.out --release 8 -Xlint:deprecation,-options -XDrawDiagnostics SuppressDeprecation.java
 */

/* Test for the contexts in which deprecations warnings should
 * (and should not) be given.  They should be given when
 * o  invoking a deprecated method from a non-deprecated one.
 * o  new X() using a deprecated constructor
 * o  super() to a deprecated constructor
 * o  extending a deprecated class.
 * But deprecation messages are suppressed as follows:
 * o  Never complain about code in the same outermost class as
 *    the deprecated entity.
 * o  Extending a deprecated class with a deprecated one is OK.
 * o  Overriding a deprecated method with a deprecated one is OK.
 * o  Code appearing in a deprecated class is OK.
 *
 */

class T {
    /** var.
     *  @deprecated . */
    int var;

    /** f.
     *  @deprecated . */
    void f() {
    }

    /** g.
     *  @deprecated . */
    void g() {
        f();
    }

    void h() {
        f();
    }

    /** T.
     *  @deprecated . */
    T() {
    }

    /** T.
     *  @deprecated . */
    T(int i) {
        this();
    }

    T(float f) {
        this();
    }

    void xyzzy() {
        new T();
        new T(1.4f);
    }
    /** plugh.
     *  @deprecated . */
    void plugh() {
        new T();
        new T(1.45f);
    }

    /** calcx..
     *  @deprecated . */
    int calcx() { return 0; }
}

class U extends T {
    /** f.
     * @deprecated . */
    void f() {
    }

    void g() { // error (1)
        super.g(); // error (2)
        var = 12; // error (3)
    }

    U() {} // error (4)

    U(int i) {
        super(i); // error (5)
    }

    U(float f) {
        super(1.3f);
    }
}

class V extends T {} // error (6)

/** W.
 * @deprecated . */
class W extends T { // ok - inside deprecated class
    /** W.
     * @deprecated . */
    static {
        new T(1.3f).g(); // ok - called from deprecated static block
    }

    /** W.
     * @deprecated . */
    {
        new T(1.3f).g(); // ok - called from deprecated block
    }

    {
        new T(1.3f).g(); // ok - inside deprecated class
    }

    int x = calcx(); // ok - inside deprecated class

    /** y.
     * @deprecated . */
    int y = calcx();
}

/** X.
 * @deprecated . */
class X {}

class Y extends X {} // ok - not overriding anything

/** Z.
 * @deprecated . */
class Z extends X {}
