/* * @test /nodynamiccopyright/ * @bug 8030741 8078024 * @summary Inference: implement eager resolution of return types, consistent with JDK-8028800 * @compile/fail/ref=EagerReturnTypeResolutionTestb.out -XDrawDiagnostics EagerReturnTypeResolutionTestb.java * @author Dan Smith */ import java.util.List; public class EagerReturnTypeResolutionTestb { interface I {} interface J extends I {} interface K extends I {} interface L extends I {} T lower(List l) { return null; } T lower2(List l1, List l2) { return null; } T upper(List l) { return null; } T upper2(List l1, List l2) { return null; } T eq(List l) { return null; } T eq2(List l1, List l2) { return null; } void takeI(I i) {} void takeIString(I i) {} I iStringField; void takeLong(long arg) {} long longField; void testSimpleCaptureOK(List> i1) { takeI(lower(i1)); // ok* takeI(eq(i1)); // ok* takeI(upper(i1)); // ok, no capture takeIString(upper(i1)); // ok iStringField = upper(i1); // ok } void testSimpleCaptureKO(List> i1) { takeIString(lower(i1)); // ERROR takeIString(eq(i1)); // ERROR iStringField = lower(i1); // ERROR iStringField = eq(i1); // ERROR } void testMultiCaptureOK(List> i1, List> i2, List> i3, List> j1, List> j2, List k1) { /* Lines marked with JDK-8029002 should be uncommented once this bug is * fixed */ takeI(lower2(i1, i2)); // ok* takeI(lower2(i1, i3)); // ok* takeI(upper2(i1, i3)); // ok, no capture* JDK-8029002 takeIString(upper2(i1, i3)); // ok, no capture iStringField = upper2(i1, i3); // ok, no capture takeI(lower2(j1, j2)); // ok* takeI(lower2(j1, k1)); // ok, no capture takeI(upper2(j1, k1)); // ok, no capture* JDK-8029002 takeIString(lower2(j1, k1)); // ok, no capture takeIString(upper2(j1, k1)); // ok, no capture iStringField = lower2(j1, k1); // ok, no capture iStringField = upper2(j1, k1); // ok, no capture takeI(lower2(j2, k1)); // ok* } void testMultiCaptureKO(List> i1, List> i2, List> i3, List> j1, List> j2, List k1) { takeI(eq2(i1, i2)); // ERROR, bad bounds takeI(upper2(i1, i2)); // ERROR, bad bounds takeIString(lower2(i1, i2)); // ERROR takeIString(eq2(i1, i2)); // ERROR, bad bounds takeIString(upper2(i1, i2)); // ERROR, bad bounds iStringField = lower2(i1, i2); // ERROR iStringField = eq2(i1, i2); // ERROR, bad bounds iStringField = upper2(i1, i2); // ERROR, bad bounds takeI(eq2(i1, i3)); // ERROR, bad bounds takeIString(lower2(i1, i3)); // ERROR takeIString(eq2(i1, i3)); // ERROR, bad bounds iStringField = lower2(i1, i3); // ERROR iStringField = eq2(i1, i3); // ERROR, bad bounds takeI(eq2(j1, j2)); // ERROR, bad bounds takeI(upper2(j1, j2)); // ERROR, bad bounds takeIString(lower2(j1, j2)); // ERROR takeIString(eq2(j1, j2)); // ERROR, bad bounds takeIString(upper2(j1, j2)); // ERROR, bad bounds iStringField = lower2(j1, j2); // ERROR iStringField = eq2(j1, j2); // ERROR, bad bounds iStringField = upper2(j1, j2); // ERROR, bad bounds takeI(eq2(j1, k1)); // ERROR, bad bounds takeIString(eq2(j1, k1)); // ERROR, bad bounds iStringField = eq2(j1, k1); // ERROR, bad bounds takeI(eq2(j2, k1)); // ERROR, bad bounds takeI(upper2(j2, k1)); // ERROR, bad bounds; actual: no error, see JDK-8037474 takeIString(lower2(j2, k1)); // ERROR takeIString(eq2(j2, k1)); // ERROR, bad bounds takeIString(upper2(j2, k1)); // ERROR, bad bounds iStringField = lower2(j2, k1); // ERROR iStringField = eq2(j2, k1); // ERROR, bad bounds iStringField = upper2(j2, k1); // ERROR, bad bounds } void testRawOK(List i1, List j1, List> l1) { takeI(lower(i1)); // ok, unchecked takeI(eq(i1)); // ok, unchecked takeI(upper(i1)); // ok, no capture, not unchecked takeIString(lower(i1)); // ok, unchecked takeIString(eq(i1)); // ok, unchecked takeIString(upper(i1)); // ok, no capture, not unchecked iStringField = lower(i1); // ok, unchecked iStringField = eq(i1); // ok, unchecked iStringField = upper(i1); // ok, no capture, not unchecked takeI(lower(j1)); // ok, unchecked takeI(eq(j1)); // ok, unchecked takeI(upper(j1)); // bad bounds? -- spec is unclear takeIString(lower(j1)); // ok, unchecked takeIString(eq(j1)); // ok, unchecked takeIString(upper(j1)); // bad bounds? -- spec is unclear iStringField = lower(j1); // ok, unchecked iStringField = eq(j1); // ok, unchecked iStringField = upper(j1); // bad bounds? -- spec is unclear takeI(lower(l1)); // ok, unchecked takeI(eq(l1)); // ok, unchecked takeI(upper(l1)); // bad bounds? -- spec is unclear takeIString(lower(l1)); // ok, unchecked takeIString(eq(l1)); // ok, unchecked takeIString(upper(l1)); // bad bounds? -- spec is unclear iStringField = lower(l1); // ok, unchecked iStringField = eq(l1); // ok, unchecked iStringField = upper(l1); // bad bounds? -- spec is unclear } void testPrimOK(List i1, List l1, List d1) { takeLong(lower(i1)); // ok takeLong(eq(i1)); // ok takeLong(upper(i1)); // ok* longField = lower(i1); // ok longField = eq(i1); // ok longField = upper(i1); // ok* takeLong(lower(l1)); // ok takeLong(eq(l1)); // ok takeLong(upper(l1)); // ok longField = lower(l1); // ok longField = eq(l1); // ok longField = upper(l1); // ok } void testPrimKO(List i1, List l1, List d1) { takeLong(lower(d1)); // ERROR takeLong(eq(d1)); // ERROR takeLong(upper(d1)); // ERROR longField = lower(d1); // ERROR longField = eq(d1); // ERROR longField = upper(d1); // ERROR } }