test/tools/javac/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.java

changeset 2402
b45fd486977d
parent 2382
14979dd5e034
equal deleted inserted replaced
2397:d1005694e384 2402:b45fd486977d
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 }

mercurial