8009545: Graph inference: dependencies between inference variables should be set during incorporation
authormcimadamore
Tue, 12 Mar 2013 16:02:43 +0000
changeset 16341 cc4b4e3c0f12
parent 16340 3c0af3413e0f
child 16342 28d6ae9ed67c
8009545: Graph inference: dependencies between inference variables should be set during incorporation Summary: Move all transitivity checks into the incorporation round Reviewed-by: jjg
langtools/src/share/classes/com/sun/tools/javac/code/Type.java
langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java
langtools/test/tools/javac/lambda/TargetType28.out
--- 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));
--- 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);
-                            }
                         }
                     }
                 }
--- 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