--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jul 17 14:04:01 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jul 17 14:09:46 2013 +0100
@@ -2708,10 +2708,21 @@
setFunctionalInfo(that, pt(), desc, target, resultInfo.checkContext.inferenceContext());
List<Type> argtypes = desc.getParameterTypes();
-
- Pair<Symbol, Resolve.ReferenceLookupHelper> refResult =
- rs.resolveMemberReference(that.pos(), localEnv, that,
- that.expr.type, that.name, argtypes, typeargtypes, true, rs.resolveMethodCheck);
+ Resolve.MethodCheck referenceCheck = rs.resolveMethodCheck;
+
+ if (resultInfo.checkContext.inferenceContext().free(argtypes)) {
+ referenceCheck = rs.new MethodReferenceCheck(resultInfo.checkContext.inferenceContext());
+ }
+
+ Pair<Symbol, Resolve.ReferenceLookupHelper> refResult = null;
+ List<Type> saved_undet = resultInfo.checkContext.inferenceContext().save();
+ try {
+ refResult = rs.resolveMemberReference(that.pos(), localEnv, that, that.expr.type,
+ that.name, argtypes, typeargtypes, true, referenceCheck,
+ resultInfo.checkContext.inferenceContext());
+ } finally {
+ resultInfo.checkContext.inferenceContext().rollback(saved_undet);
+ }
Symbol refSym = refResult.fst;
Resolve.ReferenceLookupHelper lookupHelper = refResult.snd;
@@ -2823,17 +2834,24 @@
}
}
- that.sym = refSym.baseSymbol();
- that.kind = lookupHelper.referenceKind(that.sym);
-
ResultInfo checkInfo =
resultInfo.dup(newMethodTemplate(
desc.getReturnType().hasTag(VOID) ? Type.noType : desc.getReturnType(),
- lookupHelper.argtypes,
- typeargtypes));
+ that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes));
Type refType = checkId(that, lookupHelper.site, refSym, localEnv, checkInfo);
+ if (that.kind.isUnbound() &&
+ resultInfo.checkContext.inferenceContext().free(argtypes.head)) {
+ //re-generate inference constraints for unbound receiver
+ if (!types.isSubtype(resultInfo.checkContext.inferenceContext().asFree(argtypes.head), exprType)) {
+ //cannot happen as this has already been checked - we just need
+ //to regenerate the inference constraints, as that has been lost
+ //as a result of the call to inferenceContext.save()
+ Assert.error("Can't get here");
+ }
+ }
+
if (!refType.isErroneous()) {
refType = types.createMethodTypeWithReturn(refType,
adjustMethodReturnType(lookupHelper.site, that.name, checkInfo.pt.getParameterTypes(), refType.getReturnType()));