summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExprCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-07-08 06:14:04 +0000
committerDouglas Gregor <dgregor@apple.com>2010-07-08 06:14:04 +0000
commit747eb7840abcb638d6bc9590b3345608286f58f0 (patch)
tree2adb6e9fe3c8847033d030094cda8b91f5bbad77 /clang/lib/CodeGen/CGExprCXX.cpp
parentbe1f7a931efed26bfa761c33202828ccef2a2adb (diff)
downloadbcm5719-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.cpp8
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());
OpenPOWER on IntegriCloud