1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jul 17 14:04:01 2013 +0100 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jul 17 14:09:46 2013 +0100 1.3 @@ -2708,10 +2708,21 @@ 1.4 1.5 setFunctionalInfo(that, pt(), desc, target, resultInfo.checkContext.inferenceContext()); 1.6 List<Type> argtypes = desc.getParameterTypes(); 1.7 - 1.8 - Pair<Symbol, Resolve.ReferenceLookupHelper> refResult = 1.9 - rs.resolveMemberReference(that.pos(), localEnv, that, 1.10 - that.expr.type, that.name, argtypes, typeargtypes, true, rs.resolveMethodCheck); 1.11 + Resolve.MethodCheck referenceCheck = rs.resolveMethodCheck; 1.12 + 1.13 + if (resultInfo.checkContext.inferenceContext().free(argtypes)) { 1.14 + referenceCheck = rs.new MethodReferenceCheck(resultInfo.checkContext.inferenceContext()); 1.15 + } 1.16 + 1.17 + Pair<Symbol, Resolve.ReferenceLookupHelper> refResult = null; 1.18 + List<Type> saved_undet = resultInfo.checkContext.inferenceContext().save(); 1.19 + try { 1.20 + refResult = rs.resolveMemberReference(that.pos(), localEnv, that, that.expr.type, 1.21 + that.name, argtypes, typeargtypes, true, referenceCheck, 1.22 + resultInfo.checkContext.inferenceContext()); 1.23 + } finally { 1.24 + resultInfo.checkContext.inferenceContext().rollback(saved_undet); 1.25 + } 1.26 1.27 Symbol refSym = refResult.fst; 1.28 Resolve.ReferenceLookupHelper lookupHelper = refResult.snd; 1.29 @@ -2823,17 +2834,24 @@ 1.30 } 1.31 } 1.32 1.33 - that.sym = refSym.baseSymbol(); 1.34 - that.kind = lookupHelper.referenceKind(that.sym); 1.35 - 1.36 ResultInfo checkInfo = 1.37 resultInfo.dup(newMethodTemplate( 1.38 desc.getReturnType().hasTag(VOID) ? Type.noType : desc.getReturnType(), 1.39 - lookupHelper.argtypes, 1.40 - typeargtypes)); 1.41 + that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes)); 1.42 1.43 Type refType = checkId(that, lookupHelper.site, refSym, localEnv, checkInfo); 1.44 1.45 + if (that.kind.isUnbound() && 1.46 + resultInfo.checkContext.inferenceContext().free(argtypes.head)) { 1.47 + //re-generate inference constraints for unbound receiver 1.48 + if (!types.isSubtype(resultInfo.checkContext.inferenceContext().asFree(argtypes.head), exprType)) { 1.49 + //cannot happen as this has already been checked - we just need 1.50 + //to regenerate the inference constraints, as that has been lost 1.51 + //as a result of the call to inferenceContext.save() 1.52 + Assert.error("Can't get here"); 1.53 + } 1.54 + } 1.55 + 1.56 if (!refType.isErroneous()) { 1.57 refType = types.createMethodTypeWithReturn(refType, 1.58 adjustMethodReturnType(lookupHelper.site, that.name, checkInfo.pt.getParameterTypes(), refType.getReturnType()));