diff -r f6e667f52af4 -r 4ff468de829d src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java --- a/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri Feb 15 16:28:57 2013 +0000 +++ b/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri Feb 15 16:29:58 2013 +0000 @@ -68,6 +68,7 @@ final JCDiagnostic.Factory diags; final Enter enter; final Infer infer; + final Resolve rs; final Log log; final Symtab syms; final TreeMaker make; @@ -87,6 +88,7 @@ diags = JCDiagnostic.Factory.instance(context); enter = Enter.instance(context); infer = Infer.instance(context); + rs = Resolve.instance(context); log = Log.instance(context); syms = Symtab.instance(context); make = TreeMaker.instance(context); @@ -463,10 +465,12 @@ ResultInfo resultInfo; InferenceContext inferenceContext; + Env env; public Type complete(DeferredType dt, ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) { this.resultInfo = resultInfo; this.inferenceContext = deferredAttrContext.inferenceContext; + this.env = dt.env.dup(dt.tree, dt.env.info.dup()); dt.tree.accept(this); dt.speculativeCache.put(deferredAttrContext.msym, stuckTree, deferredAttrContext.phase); return Type.noType; @@ -511,12 +515,30 @@ return; } else { try { - //TODO: we should speculative determine if there's a match - //based on arity - if yes, method is applicable. types.findDescriptorType(pt); } catch (Types.FunctionDescriptorLookupError ex) { checkContext.report(null, ex.getDiagnostic()); } + JCExpression exprTree = (JCExpression)attribSpeculative(tree.getQualifierExpression(), env, + attr.memberReferenceQualifierResult(tree)); + ListBuffer argtypes = ListBuffer.lb(); + for (Type t : types.findDescriptorType(pt).getParameterTypes()) { + argtypes.append(syms.errType); + } + JCMemberReference mref2 = new TreeCopier(make).copy(tree); + mref2.expr = exprTree; + Pair lookupRes = + rs.resolveMemberReference(tree, env, mref2, exprTree.type, tree.name, argtypes.toList(), null, true); + switch (lookupRes.fst.kind) { + //note: as argtypes are erroneous types, type-errors must + //have been caused by arity mismatch + case Kinds.ABSENT_MTH: + case Kinds.WRONG_MTH: + case Kinds.WRONG_MTHS: + case Kinds.STATICERR: + case Kinds.MISSING_ENCL: + checkContext.report(null, diags.fragment("incompatible.arg.types.in.mref")); + } } } }