r191370 - Sema: Simplify code a bit, plug a potential leak.

Benjamin Kramer benny.kra at googlemail.com
Wed Sep 25 06:10:12 PDT 2013


Author: d0k
Date: Wed Sep 25 08:10:11 2013
New Revision: 191370

URL: http://llvm.org/viewvc/llvm-project?rev=191370&view=rev
Log:
Sema: Simplify code a bit, plug a potential leak.

No intended functionality change.

Modified:
    cfe/trunk/lib/Sema/SemaOverload.cpp

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=191370&r1=191369&r2=191370&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Wed Sep 25 08:10:11 2013
@@ -11392,21 +11392,7 @@ Sema::BuildCallToObjectOfClassType(Scope
     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
   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))





More information about the cfe-commits mailing list