xref: /aosp_15_r20/external/clang/test/Analysis/padding_cpp.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 -analyze -analyzer-checker=optin.performance -analyzer-config optin.performance.Padding:AllowedPad=2 -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li // Make sure that the C cases still work fine, even when compiled as C++.
4*67e74705SXin Li #include "padding_c.c"
5*67e74705SXin Li 
6*67e74705SXin Li struct BigCharArray2 { // no-warning
7*67e74705SXin Li   char c[129];
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li // xxxexpected-warning@+1{{Excessive padding in 'struct LowAlignmentBase'}}
11*67e74705SXin Li struct LowAlignmentBase : public BigCharArray2 {
12*67e74705SXin Li   int i;
13*67e74705SXin Li   char c;
14*67e74705SXin Li };
15*67e74705SXin Li 
16*67e74705SXin Li struct CorrectLowAlignmentBase : public BigCharArray2 { // no-warning
17*67e74705SXin Li   char c;
18*67e74705SXin Li   int i;
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li // xxxexpected-warning@+1{{Excessive padding in 'struct LowAlignmentBase2'}}
22*67e74705SXin Li struct LowAlignmentBase2 : public BigCharArray2 {
23*67e74705SXin Li   char c1;
24*67e74705SXin Li   int i;
25*67e74705SXin Li   char c2;
26*67e74705SXin Li };
27*67e74705SXin Li 
28*67e74705SXin Li class PaddedA { // expected-warning{{Excessive padding in 'class PaddedA'}}
29*67e74705SXin Li   char c1;
30*67e74705SXin Li   int i;
31*67e74705SXin Li   char c2;
32*67e74705SXin Li };
33*67e74705SXin Li 
34*67e74705SXin Li class VirtualPaddedA : public PaddedA { // no-warning
foo()35*67e74705SXin Li   virtual void foo() {}
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li class VirtualIntSandwich { // expected-warning{{Excessive padding in 'class VirtualIntSandwich'}}
foo()39*67e74705SXin Li   virtual void foo() {}
40*67e74705SXin Li   char c1;
41*67e74705SXin Li   int i;
42*67e74705SXin Li   char c2;
43*67e74705SXin Li };
44*67e74705SXin Li 
45*67e74705SXin Li // constructed so as not to have tail padding
46*67e74705SXin Li class InnerPaddedB { // expected-warning{{Excessive padding in 'class InnerPaddedB'}}
47*67e74705SXin Li   char c1;
48*67e74705SXin Li   int i1;
49*67e74705SXin Li   char c2;
50*67e74705SXin Li   int i2;
51*67e74705SXin Li };
52*67e74705SXin Li 
53*67e74705SXin Li class TailPaddedB { // expected-warning{{Excessive padding in 'class TailPaddedB'}}
54*67e74705SXin Li   char c1;
55*67e74705SXin Li   int i1;
56*67e74705SXin Li   char c2;
57*67e74705SXin Li };
58*67e74705SXin Li 
59*67e74705SXin Li class SI : public PaddedA { // no-warning
60*67e74705SXin Li   char c;
61*67e74705SXin Li };
62*67e74705SXin Li 
63*67e74705SXin Li class SI2 : public PaddedA { // xxxexpected-warning{{Excessive padding in 'class SI2'}}
64*67e74705SXin Li   char c10;
65*67e74705SXin Li   int i10;
66*67e74705SXin Li   char c11;
67*67e74705SXin Li };
68*67e74705SXin Li 
69*67e74705SXin Li class VirtualSI : virtual public PaddedA { // no-warning
70*67e74705SXin Li   char c;
71*67e74705SXin Li };
72*67e74705SXin Li 
73*67e74705SXin Li // currently not checked for
74*67e74705SXin Li class VirtualSI2 : virtual public PaddedA { // no-warning
75*67e74705SXin Li   char c10;
76*67e74705SXin Li   int i10;
77*67e74705SXin Li   char c11;
78*67e74705SXin Li };
79*67e74705SXin Li 
80*67e74705SXin Li class VtblSI : public PaddedA { // no-warning
foo()81*67e74705SXin Li   virtual void foo() {}
82*67e74705SXin Li   char c;
83*67e74705SXin Li };
84*67e74705SXin Li 
85*67e74705SXin Li class VtblSI2 : public PaddedA { // xxxexpected-warning{{Excessive padding in 'class VtblSI2'}}
foo()86*67e74705SXin Li   virtual void foo() {}
87*67e74705SXin Li   char c10;
88*67e74705SXin Li   int i10;
89*67e74705SXin Li   char c11;
90*67e74705SXin Li };
91*67e74705SXin Li 
92*67e74705SXin Li class VtblSI3 : public VirtualPaddedA { // xxxexpected-warning{{Excessive padding in 'class VtblSI3'}}
93*67e74705SXin Li   char c10;
94*67e74705SXin Li   int i10;
95*67e74705SXin Li   char c11;
96*67e74705SXin Li };
97*67e74705SXin Li 
98*67e74705SXin Li class MI : public PaddedA, public InnerPaddedB { // no-warning
99*67e74705SXin Li   char c;
100*67e74705SXin Li };
101*67e74705SXin Li 
102*67e74705SXin Li class MI2 : public PaddedA, public InnerPaddedB { // xxxexpected-warning{{Excessive padding in 'class MI2'}}
103*67e74705SXin Li   char c10;
104*67e74705SXin Li   int i10;
105*67e74705SXin Li   char c11;
106*67e74705SXin Li };
107*67e74705SXin Li 
108*67e74705SXin Li class VtblMI : public PaddedA, public InnerPaddedB { // xxxexpected-warning{{Excessive padding in 'class VtblMI'}}
foo()109*67e74705SXin Li   virtual void foo() {}
110*67e74705SXin Li   char c10;
111*67e74705SXin Li   int i10;
112*67e74705SXin Li   char c11;
113*67e74705SXin Li };
114*67e74705SXin Li 
115*67e74705SXin Li class VtblMI2 : public VirtualPaddedA, public InnerPaddedB { // xxxexpected-warning{{Excessive padding in 'class VtblMI2'}}
116*67e74705SXin Li   char c10;
117*67e74705SXin Li   int i10;
118*67e74705SXin Li   char c11;
119*67e74705SXin Li };
120*67e74705SXin Li 
121*67e74705SXin Li class Empty {}; // no-warning
122*67e74705SXin Li 
123*67e74705SXin Li class LotsOfSpace { // expected-warning{{Excessive padding in 'class LotsOfSpace'}}
124*67e74705SXin Li   Empty e1;
125*67e74705SXin Li   int i;
126*67e74705SXin Li   Empty e2;
127*67e74705SXin Li };
128*67e74705SXin Li 
129*67e74705SXin Li class EBO1 : public Empty { // xxxexpected-warning{{Excessive padding in 'class EBO1'}}
130*67e74705SXin Li   char c1;
131*67e74705SXin Li   int i;
132*67e74705SXin Li   char c2;
133*67e74705SXin Li };
134*67e74705SXin Li 
135*67e74705SXin Li class EBO2 : public Empty { // xxxexpected-warning{{Excessive padding in 'class EBO2'}}
136*67e74705SXin Li   Empty c1;
137*67e74705SXin Li   int i;
138*67e74705SXin Li   Empty c2;
139*67e74705SXin Li };
140*67e74705SXin Li 
141*67e74705SXin Li template <typename T>
142*67e74705SXin Li class TemplateSandwich { // expected-warning{{Excessive padding in 'class TemplateSandwich<int>' instantiated here}}
143*67e74705SXin Li   char c1;
144*67e74705SXin Li   T t;
145*67e74705SXin Li   char c2;
146*67e74705SXin Li };
147*67e74705SXin Li 
148*67e74705SXin Li template <typename T>
149*67e74705SXin Li class TemplateSandwich<T *> { // expected-warning{{Excessive padding in 'class TemplateSandwich<void *>' instantiated here}}
150*67e74705SXin Li   char c1;
151*67e74705SXin Li   T *t;
152*67e74705SXin Li   char c2;
153*67e74705SXin Li };
154*67e74705SXin Li 
155*67e74705SXin Li template <>
156*67e74705SXin Li class TemplateSandwich<long long> { // expected-warning{{Excessive padding in 'class TemplateSandwich<long long>' (}}
157*67e74705SXin Li   char c1;
158*67e74705SXin Li   long long t;
159*67e74705SXin Li   char c2;
160*67e74705SXin Li };
161*67e74705SXin Li 
162*67e74705SXin Li class Holder1 { // no-warning
163*67e74705SXin Li   TemplateSandwich<int> t1;
164*67e74705SXin Li   TemplateSandwich<char> t2;
165*67e74705SXin Li   TemplateSandwich<void *> t3;
166*67e74705SXin Li };
167*67e74705SXin Li 
168*67e74705SXin Li typedef struct { // expected-warning{{Excessive padding in 'TypedefSandwich2'}}
169*67e74705SXin Li   char c1;
170*67e74705SXin Li   typedef struct { // expected-warning{{Excessive padding in 'TypedefSandwich2::NestedTypedef'}}
171*67e74705SXin Li     char c1;
172*67e74705SXin Li     int i;
173*67e74705SXin Li     char c2;
174*67e74705SXin Li   } NestedTypedef;
175*67e74705SXin Li   NestedTypedef t;
176*67e74705SXin Li   char c2;
177*67e74705SXin Li } TypedefSandwich2;
178*67e74705SXin Li 
179*67e74705SXin Li template <typename T>
180*67e74705SXin Li struct Foo {
181*67e74705SXin Li   // expected-warning@+1{{Excessive padding in 'struct Foo<int>::Nested'}}
182*67e74705SXin Li   struct Nested {
183*67e74705SXin Li     char c1;
184*67e74705SXin Li     T t;
185*67e74705SXin Li     char c2;
186*67e74705SXin Li   };
187*67e74705SXin Li };
188*67e74705SXin Li 
189*67e74705SXin Li struct Holder { // no-warning
190*67e74705SXin Li   Foo<int>::Nested t1;
191*67e74705SXin Li   Foo<char>::Nested t2;
192*67e74705SXin Li };
193*67e74705SXin Li 
194*67e74705SXin Li struct GlobalsForLambda { // no-warning
195*67e74705SXin Li   int i;
196*67e74705SXin Li   char c1;
197*67e74705SXin Li   char c2;
198*67e74705SXin Li } G;
199*67e74705SXin Li 
200*67e74705SXin Li // expected-warning@+1{{Excessive padding in 'class (lambda}}
__anonf3d57e070302null201*67e74705SXin Li auto lambda1 = [ c1 = G.c1, i = G.i, c2 = G.c2 ]{};
__anonf3d57e070402null202*67e74705SXin Li auto lambda2 = [ i = G.i, c1 = G.c1, c2 = G.c2 ]{}; // no-warning
203