diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-09-09 23:08:42 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-09-09 23:08:42 +0000 |
commit | 5d3507d39cb6d58bd5e46bc9194972c9b00545a9 (patch) | |
tree | c823c040b2888bd3b09cbcee2d3db58f6de2e9c3 /clang/lib/AST/ExprCXX.cpp | |
parent | aec990efd72473be9cb6bbbfed4cc3c79dba84ef (diff) | |
download | bcm5719-llvm-5d3507d39cb6d58bd5e46bc9194972c9b00545a9.tar.gz bcm5719-llvm-5d3507d39cb6d58bd5e46bc9194972c9b00545a9.zip |
Improve handling of initialization by constructor, by ensuring that
such initializations properly convert constructor arguments and fill
in default arguments where necessary. This also makes the ownership
model more clear.
llvm-svn: 81394
Diffstat (limited to 'clang/lib/AST/ExprCXX.cpp')
-rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 7f39793c04d..cba0e220952 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -392,26 +392,24 @@ CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T, (T->isDependentType() || CallExpr::hasAnyValueDependentArguments(args, numargs))), Constructor(D), Elidable(elidable), Args(0), NumArgs(numargs) { - // leave room for default arguments; - const FunctionProtoType *FTy = - cast<FunctionDecl>(D)->getType()->getAsFunctionProtoType(); + if (NumArgs) { + Args = new (C) Stmt*[NumArgs]; - unsigned NumArgsInProto = FTy->getNumArgs(); - unsigned NumArgsToAllocate = FTy->isVariadic() ? NumArgs : NumArgsInProto; - if (NumArgsToAllocate) { - Args = new (C) Stmt*[NumArgsToAllocate]; - - for (unsigned i = 0; i != NumArgs; ++i) + for (unsigned i = 0; i != NumArgs; ++i) { + assert(args[i] && "NULL argument in CXXConstructExpr"); Args[i] = args[i]; - - // Set default arguments to 0. - for (unsigned i = NumArgs; i != NumArgsToAllocate; ++i) - Args[i] = 0; - - NumArgs = NumArgsToAllocate; + } } } +CXXConstructExpr::CXXConstructExpr(EmptyShell Empty, ASTContext &C, + unsigned numargs) + : Expr(CXXConstructExprClass, Empty), Args(0), NumArgs(numargs) +{ + if (NumArgs) + Args = new (C) Stmt*[NumArgs]; +} + void CXXConstructExpr::DoDestroy(ASTContext &C) { DestroyChildren(C); if (Args) |