Don't build an aggregate constructor loop when the constructor is trivial.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102912 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2010-05-03 15:09:17 +00:00
Родитель 33d73fa9db
Коммит e99bdb6969
2 изменённых файлов: 17 добавлений и 5 удалений

Просмотреть файл

@ -465,11 +465,13 @@ static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E,
llvm::Value *NewPtr, llvm::Value *NewPtr,
llvm::Value *NumElements) { llvm::Value *NumElements) {
if (E->isArray()) { if (E->isArray()) {
if (CXXConstructorDecl *Ctor = E->getConstructor()) if (CXXConstructorDecl *Ctor = E->getConstructor()) {
CGF.EmitCXXAggrConstructorCall(Ctor, NumElements, NewPtr, if (!Ctor->getParent()->hasTrivialConstructor())
E->constructor_arg_begin(), CGF.EmitCXXAggrConstructorCall(Ctor, NumElements, NewPtr,
E->constructor_arg_end()); E->constructor_arg_begin(),
return; E->constructor_arg_end());
return;
}
} }
QualType AllocType = E->getAllocatedType(); QualType AllocType = E->getAllocatedType();

Просмотреть файл

@ -96,3 +96,13 @@ void t11() {
// CHECK: call void @llvm.memset.p0i8.i64( // CHECK: call void @llvm.memset.p0i8.i64(
B* b = new B(); B* b = new B();
} }
struct Empty { };
// We don't need to initialize an empty class.
void t12() {
// CHECK: define void @_Z3t12v
// CHECK-NOT: br label
// CHECK: ret void
(void)new Empty[10];
}