aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/ExprCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-09-09 23:08:42 +0000
committerDouglas Gregor <dgregor@apple.com>2009-09-09 23:08:42 +0000
commit39da0b8145eaec7da7004f9b3645c5c9f4f63b1d (patch)
tree736478849d6a4c9123a029dc251b7b242111088d /lib/AST/ExprCXX.cpp
parent84ec96c8a810df59de4052368beab29f13456707 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81394 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ExprCXX.cpp')
-rw-r--r--lib/AST/ExprCXX.cpp28
1 files changed, 13 insertions, 15 deletions
diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp
index 7f39793c04..cba0e22095 100644
--- a/lib/AST/ExprCXX.cpp
+++ b/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)