1/*
2 * @test /nodynamiccopyright/
3 * @summary smoke test for inference of throws type variables
4 * @compile/fail/ref=TargetType63.out -XDrawDiagnostics TargetType63.java
5 */
6class TargetType63 {
7
8    interface F<T extends Throwable> {
9        void m() throws T;
10    }
11
12    void g1() { }
13    void g2() throws ClassNotFoundException { }
14    void g3() throws Exception { }
15
16    <Z extends Throwable> void m1(F<Z> fz) throws Z { }
17    <Z extends ClassNotFoundException> void m2(F<Z> fz) throws Z { }
18
19    void test1() {
20        m1(()->{ }); //ok (Z = RuntimeException)
21        m1(this::g1); //ok (Z = RuntimeException)
22    }
23
24    void test2() {
25        m2(()->{ }); //fail (Z = ClassNotFoundException)
26        m2(this::g1); //fail (Z = ClassNotFoundException)
27    }
28
29    void test3() {
30        m1(()->{ throw new ClassNotFoundException(); }); //fail (Z = ClassNotFoundException)
31        m1(this::g2); //fail (Z = ClassNotFoundException)
32        m2(()->{ throw new ClassNotFoundException(); }); //fail (Z = ClassNotFoundException)
33        m2(this::g2); //fail (Z = ClassNotFoundException)
34    }
35
36    void test4() {
37        m1(()->{ throw new Exception(); }); //fail (Z = Exception)
38        m1(this::g3); //fail (Z = Exception)
39    }
40}
41