/*
 * @test /nodynamiccopyright/
 * @bug     6558548 7039937
 * @summary The compiler needs to be aligned with clarified specification of throws
 * @compile/fail/ref=T6558548_latest.out -XDrawDiagnostics T6558548.java
 * @compile/fail/ref=T6558548_6.out -source 6 -Xlint:-options -XDrawDiagnostics T6558548.java
 */

class T6558548 {

    void nothing() {}
    void checked() throws InterruptedException {}
    void runtime() throws IllegalArgumentException {}

    void m1a() {
        try {
            throw new java.io.FileNotFoundException();
        }
        catch(java.io.FileNotFoundException exc) { }
        catch(java.io.IOException exc) { } // 6: ok; latest: unreachable
    }

    void m1b() {
        try {
            throw new java.io.IOException();
        }
        catch(java.io.FileNotFoundException exc) { }
        catch(java.io.IOException exc) { } //ok
    }

    void m1c() {
        try {
            throw new java.io.FileNotFoundException();
        }
        catch(java.io.FileNotFoundException exc) { }
        catch(Exception ex) { } //ok (Exception/Throwable always allowed)
    }

    void m1d() {
        try {
            throw new java.io.FileNotFoundException();
        }
        catch(java.io.FileNotFoundException exc) { }
        catch(Throwable ex) { } //ok (Exception/Throwable always allowed)
    }

    void m3() {
        try {
            checked();
        }
        catch(Exception exc) { } //ok
    }

    void m4() {
        try {
            runtime();
        }
        catch(Exception exc) { } //ok
    }

    void m5() {
        try {
            nothing();
        }
        catch(Throwable exc) { } //ok
    }

    void m6() {
        try {
            checked();
        }
        catch(Throwable exc) { } //ok
    }

    void m7() {
        try {
            runtime();
        }
        catch(Throwable exc) { } //ok
    }

    void m9() {
        try {
            checked();
        }
        catch(Error exc) { }
        catch(Throwable exc) { } //ok
    }

    void m10() {
        try {
            runtime();
        }
        catch(Error exc) { }
        catch(Throwable exc) { } //ok
    }

    void m11() {
        try {
            nothing();
        }
        catch(Error exc) { }
        catch(Throwable exc) { } //ok
    }

    void m12() {
        try {
            checked();
        }
        catch(RuntimeException exc) { }
        catch(Throwable exc) { } // ok
    }

    void m13() {
        try {
            runtime();
        }
        catch(RuntimeException exc) { }
        catch(Throwable exc) { } // ok
    }

    void m14() {
        try {
            nothing();
        }
        catch(RuntimeException exc) { }
        catch(Throwable exc) { } // ok
    }

    void m15() {
        try {
            checked();
        }
        catch(RuntimeException exc) { }
        catch(Exception exc) { } //ok
    }

    void m16() {
        try {
            runtime();
        }
        catch(RuntimeException exc) { }
        catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m17() {
        try {
            nothing();
        }
        catch(RuntimeException exc) { }
        catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m18() {
        try {
            checked();
        }
        catch(RuntimeException exc) { }
        catch(InterruptedException exc) { }
        catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m19() {
        try {
            runtime();
        }
        catch(RuntimeException exc) { }
        catch(InterruptedException exc) { } //never thrown in try
        catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m20() {
        try {
            nothing();
        }
        catch(RuntimeException exc) { }
        catch(InterruptedException exc) { } //never thrown in try
        catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m21() {
        try {
            checked();
        }
        catch(RuntimeException exc) { }
        catch(Exception exc) { } // ok
    }

    void m22() {
        try {
            runtime();
        }
        catch(RuntimeException exc) { }
        catch(Exception exc) { } // 6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m23() {
        try {
            nothing();
        }
        catch(RuntimeException exc) { }
        catch(Exception exc) { } // 6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m24() {
        try {
            checked();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(Throwable exc) { } //ok
    }

    void m25() {
        try {
            runtime();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m26() {
        try {
            nothing();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m27() {
        try {
            checked();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(InterruptedException exc) { }
        catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m28() {
        try {
            runtime();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(InterruptedException exc) { } //never thrown in try
        catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m29() {
        try {
            nothing();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(InterruptedException exc) { } //never thrown in try
        catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m30() {
        try {
            checked();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(Throwable exc) { } //ok
    }

    void m31() {
        try {
            runtime();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m32() {
        try {
            nothing();
        }
        catch(RuntimeException exc) { }
        catch(Error exc) { }
        catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
    }

    void m33() {
        try {
            checked();
        }
        catch(InterruptedException exc) { } //ok
    }

    void m34() {
        try {
            runtime();
        }
        catch(InterruptedException exc) { } //never thrown in try
    }

    void m35() {
        try {
            nothing();
        }
        catch(InterruptedException exc) { } //never thrown in try
    }
}
