From 1eab66c7ccb1f388d7b7df0673b76fb233826643 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Thu, 19 Nov 2009 18:39:40 +0000 Subject: Patch to implement new-operators with default args. Fixes pr5547. llvm-svn: 89370 --- clang/lib/Sema/SemaExprCXX.cpp | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'clang/lib/Sema/SemaExprCXX.cpp') diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 462bf13540e..209d3069caf 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -326,7 +326,7 @@ Sema::ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, QualType AllocType = GetTypeForDeclarator(D, /*Scope=*/0, &DInfo); if (D.isInvalidType()) return ExprError(); - + return BuildCXXNew(StartLoc, UseGlobal, PlacementLParen, move(PlacementArgs), @@ -394,7 +394,7 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal, FunctionDecl *OperatorDelete = 0; Expr **PlaceArgs = (Expr**)PlacementArgs.get(); unsigned NumPlaceArgs = PlacementArgs.size(); - + if (!AllocType->isDependentType() && !Expr::hasAnyTypeDependentArguments(PlaceArgs, NumPlaceArgs) && FindAllocationFunctions(StartLoc, @@ -402,7 +402,35 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal, UseGlobal, AllocType, ArraySize, PlaceArgs, NumPlaceArgs, OperatorNew, OperatorDelete)) return ExprError(); - + llvm::SmallVector AllPlaceArgs; + if (OperatorNew) { + // Add default arguments, if any. + const FunctionProtoType *Proto = + OperatorNew->getType()->getAs(); + unsigned NumArgsInProto = Proto->getNumArgs(); + for (unsigned i = 1; i != NumArgsInProto; i++) { + QualType ProtoArgType = Proto->getArgType(i); + + Expr *Arg; + if (i <= NumPlaceArgs) { + AllPlaceArgs.push_back(PlaceArgs[i-1]); + continue; + } + ParmVarDecl *Param = OperatorNew->getParamDecl(i); + + OwningExprResult ArgExpr = + BuildCXXDefaultArgExpr(StartLoc, OperatorNew, Param); + if (ArgExpr.isInvalid()) + return ExprError(); + + Arg = ArgExpr.takeAs(); + AllPlaceArgs.push_back(Arg); + } + NumPlaceArgs = AllPlaceArgs.size(); + if (NumPlaceArgs > 0) + PlaceArgs = &AllPlaceArgs[0]; + } + bool Init = ConstructorLParen.isValid(); // --- Choosing a constructor --- // C++ 5.3.4p15 -- cgit v1.2.3