diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-11-19 18:39:40 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-11-19 18:39:40 +0000 |
commit | 1eab66c7ccb1f388d7b7df0673b76fb233826643 (patch) | |
tree | 35238ac14715e45e880e0638019ccda2704e0aca /clang/lib/Sema/SemaExprCXX.cpp | |
parent | 36a5bf82bf714e498c4dfe4654d131d84541c60a (diff) | |
download | bcm5719-llvm-1eab66c7ccb1f388d7b7df0673b76fb233826643.tar.gz bcm5719-llvm-1eab66c7ccb1f388d7b7df0673b76fb233826643.zip |
Patch to implement new-operators with default args.
Fixes pr5547.
llvm-svn: 89370
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 34 |
1 files changed, 31 insertions, 3 deletions
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<Expr *, 4> AllPlaceArgs; + if (OperatorNew) { + // Add default arguments, if any. + const FunctionProtoType *Proto = + OperatorNew->getType()->getAs<FunctionProtoType>(); + 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<Expr>(); + AllPlaceArgs.push_back(Arg); + } + NumPlaceArgs = AllPlaceArgs.size(); + if (NumPlaceArgs > 0) + PlaceArgs = &AllPlaceArgs[0]; + } + bool Init = ConstructorLParen.isValid(); // --- Choosing a constructor --- // C++ 5.3.4p15 |