diff options
author | Douglas Gregor <dgregor@apple.com> | 2008-11-21 03:04:22 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2008-11-21 03:04:22 +0000 |
commit | 9ecea26443d3f291bb9b82730e14df5962deb9b6 (patch) | |
tree | a85a850cc471ab117afdacc86860b3634d8bdb45 /clang/lib/Sema/SemaOverload.cpp | |
parent | c6918c1ffa71c2202143862ee357bd3ebc28b931 (diff) | |
download | bcm5719-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.cpp | 17 |
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()); |