1*67e74705SXin Li // Test -fsanitize-memory-use-after-dtor 2*67e74705SXin Li // RUN: %clang_cc1 -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-optzns -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s 3*67e74705SXin Li // RUN: %clang_cc1 -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-optzns -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s 4*67e74705SXin Li 5*67e74705SXin Li // 24 bytes total 6*67e74705SXin Li struct Packed { 7*67e74705SXin Li // Packed into 4 bytes 8*67e74705SXin Li unsigned int a : 1; 9*67e74705SXin Li unsigned int b : 1; 10*67e74705SXin Li //unsigned int c : 1; 11*67e74705SXin Li // Force alignment to next 4 bytes 12*67e74705SXin Li unsigned int : 0; 13*67e74705SXin Li unsigned int d : 1; 14*67e74705SXin Li // Force alignment, 8 more bytes 15*67e74705SXin Li double e = 5.0; 16*67e74705SXin Li // 4 bytes 17*67e74705SXin Li unsigned int f : 1; ~PackedPacked18*67e74705SXin Li ~Packed() {} 19*67e74705SXin Li }; 20*67e74705SXin Li Packed p; 21*67e74705SXin Li 22*67e74705SXin Li 23*67e74705SXin Li // 1 byte total 24*67e74705SXin Li struct Empty { 25*67e74705SXin Li unsigned int : 0; ~EmptyEmpty26*67e74705SXin Li ~Empty() {} 27*67e74705SXin Li }; 28*67e74705SXin Li Empty e; 29*67e74705SXin Li 30*67e74705SXin Li 31*67e74705SXin Li // 4 byte total 32*67e74705SXin Li struct Simple { 33*67e74705SXin Li unsigned int a : 1; ~SimpleSimple34*67e74705SXin Li ~Simple() {} 35*67e74705SXin Li }; 36*67e74705SXin Li Simple s; 37*67e74705SXin Li 38*67e74705SXin Li 39*67e74705SXin Li // 8 bytes total 40*67e74705SXin Li struct Anon { 41*67e74705SXin Li // 1 byte 42*67e74705SXin Li unsigned int a : 1; 43*67e74705SXin Li unsigned int b : 2; 44*67e74705SXin Li // Force alignment to next byte 45*67e74705SXin Li unsigned int : 0; 46*67e74705SXin Li unsigned int c : 1; ~AnonAnon47*67e74705SXin Li ~Anon() {} 48*67e74705SXin Li }; 49*67e74705SXin Li Anon an; 50*67e74705SXin Li 51*67e74705SXin Li 52*67e74705SXin Li struct CharStruct { 53*67e74705SXin Li char c; 54*67e74705SXin Li ~CharStruct(); 55*67e74705SXin Li }; 56*67e74705SXin Li 57*67e74705SXin Li struct Adjacent { 58*67e74705SXin Li CharStruct a; 59*67e74705SXin Li int b : 1; 60*67e74705SXin Li CharStruct c; ~AdjacentAdjacent61*67e74705SXin Li ~Adjacent() {} 62*67e74705SXin Li }; 63*67e74705SXin Li Adjacent ad; 64*67e74705SXin Li 65*67e74705SXin Li 66*67e74705SXin Li // CHECK-LABEL: define {{.*}}PackedD2Ev 67*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 17 68*67e74705SXin Li // CHECK: ret void 69*67e74705SXin Li 70*67e74705SXin Li // CHECK-LABEL: define {{.*}}EmptyD2Ev 71*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback{{.*}}i64 0 72*67e74705SXin Li // CHECK: ret void 73*67e74705SXin Li 74*67e74705SXin Li // CHECK-LABEL: define {{.*}}SimpleD2Ev 75*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 1 76*67e74705SXin Li // CHECK: ret void 77*67e74705SXin Li 78*67e74705SXin Li // CHECK-LABEL: define {{.*}}AnonD2Ev 79*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 5 80*67e74705SXin Li // CHECK: ret void 81*67e74705SXin Li 82*67e74705SXin Li // CHECK-LABEL: define {{.*}}AdjacentD2Ev 83*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 1 84*67e74705SXin Li // CHECK: ret void 85