xref: /aosp_15_r20/external/clang/test/CodeGenCXX/sanitize-dtor-bit-field.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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