1/*
2 * @test /nodynamiccopyright/
3 * @bug 6939620 7020044 8062373
4 *
5 * @summary  Check that diamond fails when inference violates declared bounds
6 *           (test with inner class, qualified/simple type expressions)
7 * @author mcimadamore
8 * @compile/fail/ref=Neg03.out Neg03.java -XDrawDiagnostics
9 *
10 */
11
12class Neg03<U> {
13
14    class Foo<V extends Number> {
15        Foo(V x) {}
16        <Z> Foo(V x, Z z) {}
17    }
18
19    void testSimple() {
20        Foo<String> f1 = new Foo<>("");
21        Foo<? extends String> f2 = new Foo<>("");
22        Foo<?> f3 = new Foo<>("");
23        Foo<? super String> f4 = new Foo<>("");
24
25        Foo<String> f5 = new Foo<>("", "");
26        Foo<? extends String> f6 = new Foo<>("", "");
27        Foo<?> f7 = new Foo<>("", "");
28        Foo<? super String> f8 = new Foo<>("", "");
29
30        Foo<String> f9 = new Foo<>(""){};
31        Foo<? extends String> f10 = new Foo<>(""){};
32        Foo<?> f11 = new Foo<>(""){};
33        Foo<? super String> f12 = new Foo<>(""){};
34
35        Foo<String> f13 = new Foo<>("", ""){};
36        Foo<? extends String> f14 = new Foo<>("", ""){};
37        Foo<?> f15 = new Foo<>("", ""){};
38        Foo<? super String> f16 = new Foo<>("", ""){};
39    }
40
41    void testQualified_1() {
42        Foo<String> f1 = new Neg03<U>.Foo<>("");
43        Foo<? extends String> f2 = new Neg03<U>.Foo<>("");
44        Foo<?> f3 = new Neg03<U>.Foo<>("");
45        Foo<? super String> f4 = new Neg03<U>.Foo<>("");
46
47        Foo<String> f5 = new Neg03<U>.Foo<>("", "");
48        Foo<? extends String> f6 = new Neg03<U>.Foo<>("", "");
49        Foo<?> f7 = new Neg03<U>.Foo<>("", "");
50        Foo<? super String> f8 = new Neg03<U>.Foo<>("", "");
51
52        Foo<String> f9 = new Neg03<U>.Foo<>(""){};
53        Foo<? extends String> f10 = new Neg03<U>.Foo<>(""){};
54        Foo<?> f11 = new Neg03<U>.Foo<>(""){};
55        Foo<? super String> f12 = new Neg03<U>.Foo<>(""){};
56
57        Foo<String> f13 = new Neg03<U>.Foo<>("", ""){};
58        Foo<? extends String> f14 = new Neg03<U>.Foo<>("", ""){};
59        Foo<?> f15 = new Neg03<U>.Foo<>("", ""){};
60        Foo<? super String> f16 = new Neg03<U>.Foo<>("", ""){};
61    }
62
63    void testQualified_2(Neg03<U> n) {
64        Foo<String> f1 = n.new Foo<>("");
65        Foo<? extends String> f2 = n.new Foo<>("");
66        Foo<?> f3 = n.new Foo<>("");
67        Foo<? super String> f4 = n.new Foo<>("");
68
69        Foo<String> f5 = n.new Foo<>("", "");
70        Foo<? extends String> f6 = n.new Foo<>("", "");
71        Foo<?> f7 = n.new Foo<>("", "");
72        Foo<? super String> f8 = n.new Foo<>("", "");
73
74        Foo<String> f9 = n.new Foo<>(""){};
75        Foo<? extends String> f10 = n.new Foo<>(""){};
76        Foo<?> f11 = n.new Foo<>(""){};
77        Foo<? super String> f12 = n.new Foo<>(""){};
78
79        Foo<String> f13 = n.new Foo<>("", ""){};
80        Foo<? extends String> f14 = n.new Foo<>("", ""){};
81        Foo<?> f15 = n.new Foo<>("", ""){};
82        Foo<? super String> f16 = n.new Foo<>("", ""){};
83    }
84}
85