1 /* |
|
2 * @test /nodynamiccopyright/ |
|
3 * @bug 8030741 |
|
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 |
|
9 import java.util.List; |
|
10 |
|
11 public 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 } |
|