# HG changeset patch # User mcimadamore # Date 1458752342 0 # Node ID 4e98efed865f5acf0f386ef4135048d0137d8624 # Parent ae6fa9280e0bfa5dd51b8ad1851cbc1c2702e7ee 8152411: Regression: inference fails to reject incompatible upper bounds Summary: Wrong undet variable comparison in propagation optimization Reviewed-by: vromero diff -r ae6fa9280e0b -r 4e98efed865f langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/InferenceContext.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/InferenceContext.java Wed Mar 23 13:40:42 2016 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/InferenceContext.java Wed Mar 23 16:59:02 2016 +0000 @@ -356,6 +356,7 @@ ListBuffer minUndetVars = new ListBuffer<>(); for (Type minVar : minVars) { UndetVar uv = (UndetVar)asUndetVar(minVar); + Assert.check(uv.incorporationActions.size() == 0); UndetVar uv2 = new UndetVar((TypeVar)minVar, infer.incorporationEngine(), types); for (InferenceBound ib : InferenceBound.values()) { List newBounds = uv.getBounds(ib).stream() @@ -403,15 +404,17 @@ public Void visitUndetVar(UndetVar t, Void _unused) { if (min.add(t.qtype)) { Set deps = minMap.getOrDefault(t.qtype, new HashSet<>(Collections.singleton(t.qtype))); - for (Type b : t.getBounds(InferenceBound.values())) { - Type undet = asUndetVar(b); - if (!undet.hasTag(TypeTag.UNDETVAR)) { - visit(undet); - } else if (isEquiv((UndetVar)undet, b)){ - deps.add(b); - equiv.add(b); - } else { - visit(undet); + for (InferenceBound boundKind : InferenceBound.values()) { + for (Type b : t.getBounds(boundKind)) { + Type undet = asUndetVar(b); + if (!undet.hasTag(TypeTag.UNDETVAR)) { + visit(undet); + } else if (isEquiv(t, b, boundKind)) { + deps.add(b); + equiv.add(b); + } else { + visit(undet); + } } } minMap.put(t.qtype, deps); @@ -447,11 +450,17 @@ return null; } - boolean isEquiv(UndetVar from, Type t) { + boolean isEquiv(UndetVar from, Type t, InferenceBound boundKind) { UndetVar uv = (UndetVar)asUndetVar(t); for (InferenceBound ib : InferenceBound.values()) { - List b1 = uv.getBounds(ib); - List b2 = from.getBounds(ib); + List b1 = from.getBounds(ib); + if (ib == boundKind) { + b1 = b1.diff(List.of(t)); + } + List b2 = uv.getBounds(ib); + if (ib == boundKind.complement()) { + b2 = b2.diff(List.of(from.qtype)); + } if (!b1.containsAll(b2) || !b2.containsAll(b1)) { return false; } diff -r ae6fa9280e0b -r 4e98efed865f langtools/test/tools/javac/generics/inference/8152411/T8152411.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/inference/8152411/T8152411.java Wed Mar 23 16:59:02 2016 +0000 @@ -0,0 +1,18 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8152411 + * @summary Regression: nested unchecked call does not trigger erasure of return type + * + * @compile/fail/ref=T8152411.out -XDrawDiagnostics T8152411.java + */ +import java.util.List; + +class T8152411 { + A m(List a2) { return null; } + B g(B b) { return null; } + + void test() { + List I = null; + String s = g(m(I)); + } +} diff -r ae6fa9280e0b -r 4e98efed865f langtools/test/tools/javac/generics/inference/8152411/T8152411.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/inference/8152411/T8152411.out Wed Mar 23 16:59:02 2016 +0000 @@ -0,0 +1,2 @@ +T8152411.java:16:29: compiler.err.prob.found.req: (compiler.misc.incompatible.upper.bounds: A2, java.lang.String,B,java.lang.Object,java.lang.Integer,A) +1 error