# HG changeset patch # User mcimadamore # Date 1363104163 0 # Node ID cc4b4e3c0f1285b0c258133fd18cdcf694c9b222 # Parent 3c0af3413e0f62f95fd31d90671b0327e2f01ce2 8009545: Graph inference: dependencies between inference variables should be set during incorporation Summary: Move all transitivity checks into the incorporation round Reviewed-by: jjg diff -r 3c0af3413e0f -r cc4b4e3c0f12 langtools/src/share/classes/com/sun/tools/javac/code/Type.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java Tue Mar 12 16:02:13 2013 +0000 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java Tue Mar 12 16:02:43 2013 +0000 @@ -1367,7 +1367,7 @@ for (Type b : prevBounds) { //check for redundancy - use strict version of isSameType on tvars //(as the standard version will lead to false positives w.r.t. clones ivars) - if (types.isSameType(b, bound2, true)) return; + if (types.isSameType(b, bound2, true) || bound == qtype) return; } bounds.put(ib, prevBounds.prepend(bound2)); notifyChange(EnumSet.of(ib)); diff -r 3c0af3413e0f -r cc4b4e3c0f12 langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Tue Mar 12 16:02:13 2013 +0000 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Tue Mar 12 16:02:43 2013 +0000 @@ -641,6 +641,8 @@ if (inferenceContext.inferenceVars().contains(b)) { UndetVar uv2 = (UndetVar)inferenceContext.asFree(b); //alpha <: beta + //0. set beta :> alpha + uv2.addBound(InferenceBound.LOWER, uv.qtype, infer.types); //1. copy alpha's lower to beta's for (Type l : uv.getBounds(InferenceBound.LOWER)) { uv2.addBound(InferenceBound.LOWER, inferenceContext.asInstType(l), infer.types); @@ -664,6 +666,8 @@ if (inferenceContext.inferenceVars().contains(b)) { UndetVar uv2 = (UndetVar)inferenceContext.asFree(b); //alpha :> beta + //0. set beta <: alpha + uv2.addBound(InferenceBound.UPPER, uv.qtype, infer.types); //1. copy alpha's upper to beta's for (Type u : uv.getBounds(InferenceBound.UPPER)) { uv2.addBound(InferenceBound.UPPER, inferenceContext.asInstType(u), infer.types); @@ -687,6 +691,8 @@ if (inferenceContext.inferenceVars().contains(b)) { UndetVar uv2 = (UndetVar)inferenceContext.asFree(b); //alpha == beta + //0. set beta == alpha + uv2.addBound(InferenceBound.EQ, uv.qtype, infer.types); //1. copy all alpha's bounds to beta's for (InferenceBound ib : InferenceBound.values()) { for (Type b2 : uv.getBounds(ib)) { @@ -1228,10 +1234,6 @@ if (Type.containsAny(uv_i.getBounds(InferenceBound.values()), List.of(j))) { //update i's deps n_i.deps.add(n_j); - //update j's deps - only if i's bounds contain _exactly_ j - if (uv_i.getBounds(InferenceBound.values()).contains(j)) { - n_j.deps.add(n_i); - } } } } diff -r 3c0af3413e0f -r cc4b4e3c0f12 langtools/test/tools/javac/lambda/TargetType28.out --- a/langtools/test/tools/javac/lambda/TargetType28.out Tue Mar 12 16:02:13 2013 +0000 +++ b/langtools/test/tools/javac/lambda/TargetType28.out Tue Mar 12 16:02:43 2013 +0000 @@ -1,2 +1,2 @@ -TargetType28.java:20:32: compiler.err.prob.found.req: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String,X, java.lang.Object,java.lang.Number) +TargetType28.java:20:32: compiler.err.prob.found.req: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String,R, java.lang.Object,java.lang.Number) 1 error