1.1 --- a/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Tue Feb 12 13:36:56 2013 +0000 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Tue Feb 12 19:25:09 2013 +0000 1.3 @@ -234,7 +234,7 @@ 1.4 dt.speculativeCache.put(deferredAttrContext.msym, speculativeTree, deferredAttrContext.phase); 1.5 return speculativeTree.type; 1.6 case CHECK: 1.7 - Assert.check(dt.mode == AttrMode.SPECULATIVE); 1.8 + Assert.check(dt.mode != null); 1.9 return attr.attribTree(dt.tree, dt.env, resultInfo); 1.10 } 1.11 Assert.error(); 1.12 @@ -242,6 +242,13 @@ 1.13 } 1.14 }; 1.15 1.16 + DeferredTypeCompleter dummyCompleter = new DeferredTypeCompleter() { 1.17 + public Type complete(DeferredType dt, ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) { 1.18 + Assert.check(deferredAttrContext.mode == AttrMode.CHECK); 1.19 + return dt.tree.type = Type.noType; 1.20 + } 1.21 + }; 1.22 + 1.23 /** 1.24 * The 'mode' in which the deferred type is to be type-checked 1.25 */ 1.26 @@ -382,7 +389,7 @@ 1.27 if (!progress) { 1.28 //remove all variables that have already been instantiated 1.29 //from the list of stuck variables 1.30 - inferenceContext.solveAny(inferenceContext.freeVarsIn(List.from(stuckVars))); 1.31 + inferenceContext.solveAny(List.from(stuckVars), warn); 1.32 inferenceContext.notifyChange(); 1.33 } 1.34 } 1.35 @@ -431,7 +438,15 @@ 1.36 return true; 1.37 case CHECK: 1.38 if (stuckVars.nonEmpty()) { 1.39 - return false; 1.40 + //stuck expression - see if we can propagate 1.41 + if (deferredAttrContext.parent != emptyDeferredAttrContext && 1.42 + Type.containsAny(deferredAttrContext.parent.inferenceContext.inferencevars, List.from(stuckVars))) { 1.43 + deferredAttrContext.parent.deferredAttrNodes.add(this); 1.44 + dt.check(resultInfo, List.<Type>nil(), dummyCompleter); 1.45 + return true; 1.46 + } else { 1.47 + return false; 1.48 + } 1.49 } else { 1.50 dt.check(resultInfo, stuckVars, basicCompleter); 1.51 return true;