From 0a39668d6adf1d709985eef149136a80372f5032 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 26 Nov 2008 06:01:48 +0000 Subject: [PATCH] Tweak the new ResolveOverloadedCallFn to just return a FunctionDecl. It makes ActOnCallExpr simpler git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60094 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/Sema.h | 10 +++++----- lib/Sema/SemaExpr.cpp | 12 ++++++++---- lib/Sema/SemaOverload.cpp | 22 +++++++++------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index cf9b10c0c8..c8352172f9 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -447,11 +447,11 @@ public: bool Complain); void FixOverloadedFunctionReference(Expr *E, FunctionDecl *Fn); - Expr *ResolveOverloadedCallFn(Expr *Fn, OverloadedFunctionDecl *Ovl, - SourceLocation LParenLoc, - Expr **Args, unsigned NumArgs, - SourceLocation *CommaLocs, - SourceLocation RParenLoc); + FunctionDecl *ResolveOverloadedCallFn(Expr *Fn, OverloadedFunctionDecl *Ovl, + SourceLocation LParenLoc, + Expr **Args, unsigned NumArgs, + SourceLocation *CommaLocs, + SourceLocation RParenLoc); ExprResult BuildCallToObjectOfClassType(Expr *Object, SourceLocation LParenLoc, diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index a6e1611dc3..a13bcbab62 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1295,12 +1295,16 @@ ActOnCallExpr(ExprTy *fn, SourceLocation LParenLoc, } if (Ovl) { - Fn = ResolveOverloadedCallFn(Fn, Ovl, LParenLoc, Args, NumArgs, CommaLocs, - RParenLoc); - if (!Fn) + FDecl = ResolveOverloadedCallFn(Fn, Ovl, LParenLoc, Args, NumArgs, CommaLocs, + RParenLoc); + if (!FDecl) return true; - // Fall through and build the call to Fn. + // Update Fn to refer to the actual function selected. + Expr *NewFn = new DeclRefExpr(FDecl, FDecl->getType(), + Fn->getSourceRange().getBegin()); + Fn->Destroy(Context); + Fn = NewFn; } if (getLangOptions().CPlusPlus && Fn->getType()->isRecordType()) diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 14e0f44c87..c6b028456f 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -2967,24 +2967,20 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType, /// (which eventually refers to the set of overloaded functions in /// Ovl) and the call arguments Args/NumArgs, attempt to resolve the /// function call down to a specific function. If overload resolution -/// succeeds, returns an expression that refers to a specific function -/// and deletes Fn. Otherwise, emits diagnostics, deletes all of the +/// succeeds, returns the function declaration produced by overload +/// resolution. Otherwise, emits diagnostics, deletes all of the /// arguments and Fn, and returns NULL. -Expr *Sema::ResolveOverloadedCallFn(Expr *Fn, OverloadedFunctionDecl *Ovl, - SourceLocation LParenLoc, - Expr **Args, unsigned NumArgs, - SourceLocation *CommaLocs, - SourceLocation RParenLoc) { +FunctionDecl *Sema::ResolveOverloadedCallFn(Expr *Fn, OverloadedFunctionDecl *Ovl, + SourceLocation LParenLoc, + Expr **Args, unsigned NumArgs, + SourceLocation *CommaLocs, + SourceLocation RParenLoc) { OverloadCandidateSet CandidateSet; AddOverloadCandidates(Ovl, Args, NumArgs, CandidateSet); OverloadCandidateSet::iterator Best; switch (BestViableFunction(CandidateSet, Best)) { - case OR_Success: { - Expr *NewFn = new DeclRefExpr(Best->Function, Best->Function->getType(), - Fn->getSourceRange().getBegin()); - Fn->Destroy(Context); - return NewFn; - } + case OR_Success: + return Best->Function; case OR_No_Viable_Function: Diag(Fn->getSourceRange().getBegin(), -- 2.40.0