diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2013-09-25 13:10:11 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2013-09-25 13:10:11 +0000 |
commit | 8b1a6bd8d05c313cf69ac49de1fce7917013a6fb (patch) | |
tree | 3db34f92a6662ed31db0028483d8acd4a8ad1497 | |
parent | 652784e29a4daeb54e816d313cc199dcf0cb7f54 (diff) | |
download | bcm5719-llvm-8b1a6bd8d05c313cf69ac49de1fce7917013a6fb.tar.gz bcm5719-llvm-8b1a6bd8d05c313cf69ac49de1fce7917013a6fb.zip |
Sema: Simplify code a bit, plug a potential leak.
No intended functionality change.
llvm-svn: 191370
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 1331626b332..13d19b6cb98 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -11392,21 +11392,7 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj, Method->getType()->getAs<FunctionProtoType>(); unsigned NumArgsInProto = Proto->getNumArgs(); - unsigned NumArgsToCheck = Args.size(); - - // Build the full argument list for the method call (the - // implicit object parameter is placed at the beginning of the - // list). - Expr **MethodArgs; - if (Args.size() < NumArgsInProto) { - NumArgsToCheck = NumArgsInProto; - MethodArgs = new Expr*[NumArgsInProto + 1]; - } else { - MethodArgs = new Expr*[Args.size() + 1]; - } - MethodArgs[0] = Object.get(); - for (unsigned ArgIdx = 0, e = Args.size(); ArgIdx != e; ++ArgIdx) - MethodArgs[ArgIdx + 1] = Args[ArgIdx]; + unsigned NumArgsToCheck = std::max<unsigned>(Args.size(), NumArgsInProto); DeclarationNameInfo OpLocInfo( Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc); @@ -11418,17 +11404,23 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj, if (NewFn.isInvalid()) return true; + // Build the full argument list for the method call (the implicit object + // parameter is placed at the beginning of the list). + llvm::OwningArrayPtr<Expr *> MethodArgs(new Expr*[Args.size() + 1]); + MethodArgs[0] = Object.get(); + std::copy(Args.begin(), Args.end(), &MethodArgs[1]); + // Once we've built TheCall, all of the expressions are properly // owned. QualType ResultTy = Method->getResultType(); ExprValueKind VK = Expr::getValueKindForType(ResultTy); ResultTy = ResultTy.getNonLValueExprType(Context); - CXXOperatorCallExpr *TheCall = - new (Context) CXXOperatorCallExpr(Context, OO_Call, NewFn.take(), - llvm::makeArrayRef(MethodArgs, Args.size()+1), - ResultTy, VK, RParenLoc, false); - delete [] MethodArgs; + CXXOperatorCallExpr *TheCall = new (Context) + CXXOperatorCallExpr(Context, OO_Call, NewFn.take(), + llvm::makeArrayRef(MethodArgs.get(), Args.size() + 1), + ResultTy, VK, RParenLoc, false); + MethodArgs.reset(); if (CheckCallReturnType(Method->getResultType(), LParenLoc, TheCall, Method)) |