Index: lib/CodeGen/CGExprCXX.cpp
===================================================================
--- lib/CodeGen/CGExprCXX.cpp	(revision 148198)
+++ lib/CodeGen/CGExprCXX.cpp	(working copy)
@@ -853,6 +853,20 @@
                            Alignment.getQuantity(), false);
 }
                        
+static bool NewExprUsesDirectInitialization(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()) {
+      return true;
+    }
+  }
+  return false;
+}
+
 static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E,
                                QualType ElementType,
                                llvm::Value *NewPtr,
@@ -899,11 +913,8 @@
     // 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())
+    if (NewExprUsesDirectInitialization(E))
       CGF.EmitNullInitialization(NewPtr, ElementType);
-      
     CGF.EmitCXXConstructorCall(Ctor, Ctor_Complete, /*ForVirtualBase=*/false, 
                                NewPtr, E->constructor_arg_begin(),
                                E->constructor_arg_end());
@@ -1144,9 +1155,9 @@
   // exception spec; for this part, we inline
   // CXXNewExpr::shouldNullCheckAllocation()) and we have an
   // interesting initializer.
-  bool nullCheck = allocatorType->isNothrow(getContext()) &&
-    !(allocType.isPODType(getContext()) && !E->hasInitializer());
-
+  bool nullCheck = (allocatorType->isNothrow(getContext()) &&
+    !(allocType.isPODType(getContext()) && !E->hasInitializer())) ||
+    NewExprUsesDirectInitialization(E);
   llvm::BasicBlock *nullCheckBB = 0;
   llvm::BasicBlock *contBB = 0;
 
