summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaOverload.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-11-21 03:04:22 +0000
committerDouglas Gregor <dgregor@apple.com>2008-11-21 03:04:22 +0000
commit9ecea26443d3f291bb9b82730e14df5962deb9b6 (patch)
treea85a850cc471ab117afdacc86860b3634d8bdb45 /clang/lib/Sema/SemaOverload.cpp
parentc6918c1ffa71c2202143862ee357bd3ebc28b931 (diff)
downloadbcm5719-llvm-9ecea26443d3f291bb9b82730e14df5962deb9b6.tar.gz
bcm5719-llvm-9ecea26443d3f291bb9b82730e14df5962deb9b6.zip
Cleanup memory management in overloading of operator->, slightly
llvm-svn: 59791
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r--clang/lib/Sema/SemaOverload.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index a9411cc3828..0a773719eb1 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -3205,6 +3205,8 @@ Sema::BuildOverloadedArrowExpr(Expr *Base, SourceLocation OpLoc,
}
}
+ llvm::OwningPtr<Expr> BasePtr(Base);
+
// Perform overload resolution.
OverloadCandidateSet::iterator Best;
switch (BestViableFunction(CandidateSet, Best)) {
@@ -3215,29 +3217,28 @@ Sema::BuildOverloadedArrowExpr(Expr *Base, SourceLocation OpLoc,
case OR_No_Viable_Function:
if (CandidateSet.empty())
Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
- << Base->getType().getAsString() << Base->getSourceRange();
+ << BasePtr->getType().getAsString() << BasePtr->getSourceRange();
else
Diag(OpLoc, diag::err_ovl_no_viable_oper)
- << "operator->" << Base->getSourceRange();
+ << "operator->" << BasePtr->getSourceRange();
PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
- delete Base;
return true;
case OR_Ambiguous:
Diag(OpLoc, diag::err_ovl_ambiguous_oper)
<< "operator->"
- << Base->getSourceRange();
+ << BasePtr->getSourceRange();
PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/true);
- delete Base;
return true;
}
// Convert the object parameter.
CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
- if (PerformObjectArgumentInitialization(Base, Method)) {
- delete Base;
+ if (PerformObjectArgumentInitialization(Base, Method))
return true;
- }
+
+ // No concerns about early exits now.
+ BasePtr.take();
// Build the operator call.
Expr *FnExpr = new DeclRefExpr(Method, Method->getType(), SourceLocation());
OpenPOWER on IntegriCloud