mirror of https://github.com/microsoft/clang.git
Fix crash emitting transparent list initializer for a large aggregate.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@334565 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
078d5aacfa
commit
00eb2b47be
|
@ -1673,6 +1673,8 @@ static CharUnits GetNumNonZeroBytesInInit(const Expr *E, CodeGenFunction &CGF) {
|
||||||
// If this is an initlist expr, sum up the size of sizes of the (present)
|
// If this is an initlist expr, sum up the size of sizes of the (present)
|
||||||
// elements. If this is something weird, assume the whole thing is non-zero.
|
// elements. If this is something weird, assume the whole thing is non-zero.
|
||||||
const InitListExpr *ILE = dyn_cast<InitListExpr>(E);
|
const InitListExpr *ILE = dyn_cast<InitListExpr>(E);
|
||||||
|
while (ILE && ILE->isTransparent())
|
||||||
|
ILE = dyn_cast<InitListExpr>(ILE->getInit(0));
|
||||||
if (!ILE || !CGF.getTypes().isZeroInitializable(ILE->getType()))
|
if (!ILE || !CGF.getTypes().isZeroInitializable(ILE->getType()))
|
||||||
return CGF.getContext().getTypeSizeInChars(E->getType());
|
return CGF.getContext().getTypeSizeInChars(E->getType());
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// RUN: %clang_cc1 -std=c++98 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
|
// RUN: %clang_cc1 -std=c++98 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX98
|
||||||
|
// RUN: %clang_cc1 -std=c++17 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX17
|
||||||
|
|
||||||
struct A {
|
struct A {
|
||||||
virtual ~A();
|
virtual ~A();
|
||||||
|
@ -114,13 +115,15 @@ void f() {
|
||||||
|
|
||||||
// CHECK: call void @llvm.memset.p0i8.i64
|
// CHECK: call void @llvm.memset.p0i8.i64
|
||||||
// CHECK-NOT: call void @llvm.memset.p0i8.i64
|
// CHECK-NOT: call void @llvm.memset.p0i8.i64
|
||||||
// CHECK: call void @_ZN6PR98015Test2C1Ev
|
// CHECK-CXX98: call void @_ZN6PR98015Test2C1Ev
|
||||||
|
// CHECK-CXX17: call void @_ZN6PR98014TestC1Ev
|
||||||
// CHECK-NOT: call void @_ZN6PR98015Test2C1Ev
|
// CHECK-NOT: call void @_ZN6PR98015Test2C1Ev
|
||||||
Test2 empty2[3] = {};
|
Test2 empty2[3] = {};
|
||||||
|
|
||||||
// CHECK: call void @llvm.memset.p0i8.i64
|
// CHECK: call void @llvm.memset.p0i8.i64
|
||||||
// CHECK-NOT: call void @llvm.memset.p0i8.i64
|
// CHECK-NOT: call void @llvm.memset.p0i8.i64
|
||||||
// CHECK: call void @_ZN6PR98015Test3C1Ev
|
// CHECK-CXX98: call void @_ZN6PR98015Test3C1Ev
|
||||||
|
// CHECK-CXX17: call void @_ZN6PR98014TestC2Ev
|
||||||
// CHECK-NOT: call void @llvm.memset.p0i8.i64
|
// CHECK-NOT: call void @llvm.memset.p0i8.i64
|
||||||
// CHECK-NOT: call void @_ZN6PR98015Test3C1Ev
|
// CHECK-NOT: call void @_ZN6PR98015Test3C1Ev
|
||||||
Test3 empty3[3] = {};
|
Test3 empty3[3] = {};
|
||||||
|
@ -222,7 +225,7 @@ namespace test6 {
|
||||||
// CHECK: [[CUR:%.*]] = phi [20 x [[A]]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
// CHECK: [[CUR:%.*]] = phi [20 x [[A]]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||||
|
|
||||||
// Inner loop.
|
// Inner loop.
|
||||||
// CHECK-NEXT: [[IBEGIN:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[CUR]], i32 0, i32 0
|
// CHECK-NEXT: [[IBEGIN:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[CUR]], i{{32|64}} 0, i{{32|64}} 0
|
||||||
// CHECK-NEXT: [[IEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[IBEGIN]], i64 20
|
// CHECK-NEXT: [[IEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[IBEGIN]], i64 20
|
||||||
// CHECK-NEXT: br label
|
// CHECK-NEXT: br label
|
||||||
// CHECK: [[ICUR:%.*]] = phi [[A]]* [ [[IBEGIN]], {{%.*}} ], [ [[INEXT:%.*]], {{%.*}} ]
|
// CHECK: [[ICUR:%.*]] = phi [[A]]* [ [[IBEGIN]], {{%.*}} ], [ [[INEXT:%.*]], {{%.*}} ]
|
||||||
|
@ -327,3 +330,12 @@ int explicitly_defaulted() {
|
||||||
// CHECK: call void @llvm.memset.p0i8.i64
|
// CHECK: call void @llvm.memset.p0i8.i64
|
||||||
// CHECK-NEXT: call void @_ZN8zeroinit2X2IiEC2Ev
|
// CHECK-NEXT: call void @_ZN8zeroinit2X2IiEC2Ev
|
||||||
// CHECK-NEXT: ret void
|
// CHECK-NEXT: ret void
|
||||||
|
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
namespace transparent_init_list {
|
||||||
|
struct optional_assign_base {};
|
||||||
|
struct optional_data_dtor_base { char dummy_[24]; };
|
||||||
|
struct optional : optional_data_dtor_base, optional_assign_base {};
|
||||||
|
optional f(optional a) { return {optional(a)}; }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue