summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-08-22 17:20:18 +0000
committerDouglas Gregor <dgregor@apple.com>2010-08-22 17:20:18 +0000
commitb0a04fff5185309b8b246b6383cccb8805cf272e (patch)
tree0d11a9d0003629821de166487a53fc2acad6bde7
parent630c76efb0e40498d8d8fc27b0d237c82644cdf6 (diff)
downloadbcm5719-llvm-b0a04fff5185309b8b246b6383cccb8805cf272e.tar.gz
bcm5719-llvm-b0a04fff5185309b8b246b6383cccb8805cf272e.zip
Preserve the zero-initialization and construction-kind settings when
instantiating CXXConstructExpr expressions. llvm-svn: 111780
-rw-r--r--clang/lib/Sema/TreeTransform.h11
-rw-r--r--clang/test/CodeGenCXX/value-init.cpp26
2 files changed, 34 insertions, 3 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 90ec1bd96a9..656c03d890b 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -1684,14 +1684,17 @@ public:
SourceLocation Loc,
CXXConstructorDecl *Constructor,
bool IsElidable,
- MultiExprArg Args) {
+ MultiExprArg Args,
+ bool RequiresZeroInit,
+ CXXConstructExpr::ConstructionKind ConstructKind) {
ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
ConvertedArgs))
return getSema().ExprError();
return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
- move_arg(ConvertedArgs));
+ move_arg(ConvertedArgs),
+ RequiresZeroInit, ConstructKind);
}
/// \brief Build a new object-construction expression.
@@ -5686,7 +5689,9 @@ TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
Constructor, E->isElidable(),
- move_arg(Args));
+ move_arg(Args),
+ E->requiresZeroInitialization(),
+ E->getConstructionKind());
}
/// \brief Transform a C++ temporary-binding expression.
diff --git a/clang/test/CodeGenCXX/value-init.cpp b/clang/test/CodeGenCXX/value-init.cpp
index 6977e73e8b5..c4eb1c89909 100644
--- a/clang/test/CodeGenCXX/value-init.cpp
+++ b/clang/test/CodeGenCXX/value-init.cpp
@@ -111,4 +111,30 @@ namespace zeroinit {
// CHECK-NEXT: call void @_ZN8zeroinit2X11fEv
X1().f();
}
+
+ template<typename>
+ struct X2 : X0 {
+ int x2;
+ void f();
+ };
+
+ template<typename>
+ struct X3 : X2<int> {
+ X3() : X2<int>() { }
+ };
+
+
+ // CHECK: define void @_ZN8zeroinit9testX0_X3Ev
+ void testX0_X3() {
+ // CHECK-NOT: call void @llvm.memset
+ // CHECK: call void @_ZN8zeroinit2X3IiEC1Ev
+ // CHECK: call void @_ZN8zeroinit2X2IiE1fEv
+ // CHECK-NEXT: ret void
+ X3<int>().f();
+ }
+
+ // CHECK: define linkonce_odr void @_ZN8zeroinit2X3IiEC2Ev
+ // CHECK: call void @llvm.memset.p0i8.i64
+ // CHECK-NEXT: call void @_ZN8zeroinit2X2IiEC2Ev
+ // CHECK-NEXT: ret void
}
OpenPOWER on IntegriCloud