diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-07-08 06:14:04 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-07-08 06:14:04 +0000 |
commit | 747eb7840abcb638d6bc9590b3345608286f58f0 (patch) | |
tree | 2adb6e9fe3c8847033d030094cda8b91f5bbad77 /clang/lib/CodeGen/CGExprCXX.cpp | |
parent | be1f7a931efed26bfa761c33202828ccef2a2adb (diff) | |
download | bcm5719-llvm-747eb7840abcb638d6bc9590b3345608286f58f0.tar.gz bcm5719-llvm-747eb7840abcb638d6bc9590b3345608286f58f0.zip |
Reinstate the fix for PR7556. A silly use of isTrivial() was
suppressing copies of objects with trivial copy constructors.
llvm-svn: 107857
Diffstat (limited to 'clang/lib/CodeGen/CGExprCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index f2e6a11292b..69e5f0ef4be 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -572,6 +572,14 @@ static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E, } if (CXXConstructorDecl *Ctor = E->getConstructor()) { + // Per C++ [expr.new]p15, if we have an initializer, then we're performing + // direct initialization. C++ [dcl.init]p5 requires that we + // zero-initialize storage if there are no user-declared constructors. + if (E->hasInitializer() && + !Ctor->getParent()->hasUserDeclaredConstructor() && + !Ctor->getParent()->isEmpty()) + CGF.EmitNullInitialization(NewPtr, E->getAllocatedType()); + CGF.EmitCXXConstructorCall(Ctor, Ctor_Complete, /*ForVirtualBase=*/false, NewPtr, E->constructor_arg_begin(), E->constructor_arg_end()); |