EagerReturnTypeResolutionTestb.java revision 2890:e903011dafc7
1/*
2 * @test /nodynamiccopyright/
3 * @bug 8030741 8078024
4 * @summary Inference: implement eager resolution of return types, consistent with JDK-8028800
5 * @compile/fail/ref=EagerReturnTypeResolutionTestb.out -XDrawDiagnostics EagerReturnTypeResolutionTestb.java
6 * @author Dan Smith
7 */
8
9import java.util.List;
10
11public class EagerReturnTypeResolutionTestb {
12    interface I<S> {}
13    interface J<S> extends I<S> {}
14    interface K extends I<String> {}
15    interface L<S> extends I {}
16
17    <T> T lower(List<? extends T> l) { return null; }
18    <T> T lower2(List<? extends T> l1, List<? extends T> l2) { return null; }
19
20    <T> T upper(List<? super T> l) { return null; }
21    <T> T upper2(List<? super T> l1, List<? super T> l2) { return null; }
22
23    <T> T eq(List<T> l) { return null; }
24    <T> T eq2(List<T> l1, List<T> l2) { return null; }
25
26    <X> void takeI(I<X> i) {}
27    void takeIString(I<String> i) {}
28    I<String> iStringField;
29
30    void takeLong(long arg) {}
31    long longField;
32
33    void testSimpleCaptureOK(List<I<?>> i1) {
34        takeI(lower(i1)); // ok*
35        takeI(eq(i1)); // ok*
36        takeI(upper(i1)); // ok, no capture
37        takeIString(upper(i1)); // ok
38        iStringField = upper(i1); // ok
39    }
40
41    void testSimpleCaptureKO(List<I<?>> i1) {
42        takeIString(lower(i1)); // ERROR
43        takeIString(eq(i1)); // ERROR
44        iStringField = lower(i1); // ERROR
45        iStringField = eq(i1); // ERROR
46    }
47
48    void testMultiCaptureOK(List<I<String>> i1, List<I<Integer>> i2, List<I<?>> i3,
49                          List<J<String>> j1, List<J<Integer>> j2, List<K> k1) {
50        /* Lines marked with JDK-8029002 should be uncommented once this bug is
51         * fixed
52         */
53        takeI(lower2(i1, i2)); // ok*
54        takeI(lower2(i1, i3)); // ok*
55        takeI(upper2(i1, i3)); // ok, no capture*  JDK-8029002
56
57        takeIString(upper2(i1, i3)); // ok, no capture
58        iStringField = upper2(i1, i3); // ok, no capture
59
60        takeI(lower2(j1, j2)); // ok*
61        takeI(lower2(j1, k1)); // ok, no capture
62        takeI(upper2(j1, k1)); // ok, no capture*  JDK-8029002
63
64        takeIString(lower2(j1, k1)); // ok, no capture
65        takeIString(upper2(j1, k1)); // ok, no capture
66
67        iStringField = lower2(j1, k1); // ok, no capture
68        iStringField = upper2(j1, k1); // ok, no capture
69        takeI(lower2(j2, k1)); // ok*
70    }
71
72    void testMultiCaptureKO(List<I<String>> i1, List<I<Integer>> i2, List<I<?>> i3,
73                          List<J<String>> j1, List<J<Integer>> j2, List<K> k1) {
74        takeI(eq2(i1, i2)); // ERROR, bad bounds
75        takeI(upper2(i1, i2)); // ERROR, bad bounds
76
77        takeIString(lower2(i1, i2)); // ERROR
78        takeIString(eq2(i1, i2)); // ERROR, bad bounds
79        takeIString(upper2(i1, i2)); // ERROR, bad bounds
80
81        iStringField = lower2(i1, i2); // ERROR
82        iStringField = eq2(i1, i2); // ERROR, bad bounds
83        iStringField = upper2(i1, i2); // ERROR, bad bounds
84
85        takeI(eq2(i1, i3)); // ERROR, bad bounds
86        takeIString(lower2(i1, i3)); // ERROR
87        takeIString(eq2(i1, i3)); // ERROR, bad bounds
88
89        iStringField = lower2(i1, i3); // ERROR
90        iStringField = eq2(i1, i3); // ERROR, bad bounds
91        takeI(eq2(j1, j2)); // ERROR, bad bounds
92        takeI(upper2(j1, j2)); // ERROR, bad bounds
93
94        takeIString(lower2(j1, j2)); // ERROR
95        takeIString(eq2(j1, j2)); // ERROR, bad bounds
96        takeIString(upper2(j1, j2)); // ERROR, bad bounds
97
98        iStringField = lower2(j1, j2); // ERROR
99        iStringField = eq2(j1, j2); // ERROR, bad bounds
100        iStringField = upper2(j1, j2); // ERROR, bad bounds
101
102        takeI(eq2(j1, k1)); // ERROR, bad bounds
103        takeIString(eq2(j1, k1)); // ERROR, bad bounds
104        iStringField = eq2(j1, k1); // ERROR, bad bounds
105        takeI(eq2(j2, k1)); // ERROR, bad bounds
106        takeI(upper2(j2, k1)); // ERROR, bad bounds; actual: no error, see JDK-8037474
107
108        takeIString(lower2(j2, k1)); // ERROR
109        takeIString(eq2(j2, k1)); // ERROR, bad bounds
110        takeIString(upper2(j2, k1)); // ERROR, bad bounds
111
112        iStringField = lower2(j2, k1); // ERROR
113        iStringField = eq2(j2, k1); // ERROR, bad bounds
114        iStringField = upper2(j2, k1); // ERROR, bad bounds
115    }
116
117    void testRawOK(List<I> i1, List<J> j1, List<L<String>> l1) {
118        takeI(lower(i1)); // ok, unchecked
119        takeI(eq(i1)); // ok, unchecked
120        takeI(upper(i1)); // ok, no capture, not unchecked
121
122        takeIString(lower(i1)); // ok, unchecked
123        takeIString(eq(i1)); // ok, unchecked
124        takeIString(upper(i1)); // ok, no capture, not unchecked
125
126        iStringField = lower(i1); // ok, unchecked
127        iStringField = eq(i1); // ok, unchecked
128        iStringField = upper(i1); // ok, no capture, not unchecked
129
130        takeI(lower(j1)); // ok, unchecked
131        takeI(eq(j1)); // ok, unchecked
132        takeI(upper(j1)); // bad bounds? -- spec is unclear
133
134        takeIString(lower(j1)); // ok, unchecked
135        takeIString(eq(j1)); // ok, unchecked
136        takeIString(upper(j1)); // bad bounds? -- spec is unclear
137
138        iStringField = lower(j1); // ok, unchecked
139        iStringField = eq(j1); // ok, unchecked
140        iStringField = upper(j1); // bad bounds? -- spec is unclear
141
142        takeI(lower(l1)); // ok, unchecked
143        takeI(eq(l1)); // ok, unchecked
144        takeI(upper(l1)); // bad bounds? -- spec is unclear
145
146        takeIString(lower(l1)); // ok, unchecked
147        takeIString(eq(l1)); // ok, unchecked
148        takeIString(upper(l1)); // bad bounds? -- spec is unclear
149
150        iStringField = lower(l1); // ok, unchecked
151        iStringField = eq(l1); // ok, unchecked
152        iStringField = upper(l1); // bad bounds? -- spec is unclear
153    }
154
155    void testPrimOK(List<Integer> i1, List<Long> l1, List<Double> d1) {
156        takeLong(lower(i1)); // ok
157        takeLong(eq(i1)); // ok
158        takeLong(upper(i1)); // ok*
159
160        longField = lower(i1); // ok
161        longField = eq(i1); // ok
162        longField = upper(i1); // ok*
163
164        takeLong(lower(l1)); // ok
165        takeLong(eq(l1)); // ok
166        takeLong(upper(l1)); // ok
167
168        longField = lower(l1); // ok
169        longField = eq(l1); // ok
170        longField = upper(l1); // ok
171    }
172
173    void testPrimKO(List<Integer> i1, List<Long> l1, List<Double> d1) {
174        takeLong(lower(d1)); // ERROR
175        takeLong(eq(d1)); // ERROR
176        takeLong(upper(d1)); // ERROR
177
178        longField = lower(d1); // ERROR
179        longField = eq(d1); // ERROR
180        longField = upper(d1); // ERROR
181    }
182}
183