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