1a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// RUN: %clang_cc1 -triple x86_64-unknown-linux -std=c++14 -analyze -analyzer-checker=optin.performance -analyzer-config optin.performance.Padding:AllowedPad=2 -verify %s
2a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
3a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct IntSandwich' (6 padding bytes, where 2 is optimal)}}
4a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct IntSandwich {
5a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
6a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i;
7a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
8a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
9a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
10a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct TurDuckHen' (6 padding bytes, where 2 is optimal)}}
11a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct TurDuckHen {
12a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
13a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct IntSandwich i;
14a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
15a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
16a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
17a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#pragma pack(push)
18a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#pragma pack(2)
19a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct SmallIntSandwich' (4 padding bytes, where 0 is optimal)}}
20a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct SmallIntSandwich {
21a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
22a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i1;
23a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
24a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i2;
25a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c3;
26a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i3;
27a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c4;
28a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
29a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#pragma pack(pop)
30a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
31a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarunion SomeUnion { // no-warning
32a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c;
33a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  short s;
34a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i;
35a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
36a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
37a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct HoldsAUnion' (6 padding bytes, where 2 is optimal)}}
38a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct HoldsAUnion {
39a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
40a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  union SomeUnion u;
41a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
42a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
43a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
44a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct SmallCharArray { // no-warning
45a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c[5];
46a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
47a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
48a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct MediumIntArray { // no-warning
49a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i[5];
50a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
51a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
52a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct StructSandwich' (6 padding bytes, where 2 is optimal)}}
53a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct StructSandwich {
54a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct SmallCharArray s;
55a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct MediumIntArray m;
56a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct SmallCharArray s2;
57a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
58a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
59a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'TypedefSandwich' (6 padding bytes, where 2 is optimal)}}
60a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainartypedef struct {
61a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
62a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i;
63a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
64a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar} TypedefSandwich;
65a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
66a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct StructAttrAlign' (10 padding bytes, where 2 is optimal)}}
67a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct StructAttrAlign {
68a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
69a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i;
70a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
71a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar} __attribute__((aligned(8)));
72a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
73a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct OverlyAlignedChar' (8185 padding bytes, where 4089 is optimal)}}
74a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct OverlyAlignedChar {
75a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
76a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int x;
77a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
78a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c __attribute__((aligned(4096)));
79a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
80a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
81a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct HoldsOverlyAlignedChar' (8190 padding bytes, where 4094 is optimal)}}
82a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct HoldsOverlyAlignedChar {
83a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
84a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct OverlyAlignedChar o;
85a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
86a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
87a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
88a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid internalStructFunc() {
89a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // expected-warning@+1{{Excessive padding in 'struct X' (6 padding bytes, where 2 is optimal)}}
90a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct X {
91a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    char c1;
92a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    int t;
93a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    char c2;
94a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  };
95a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct X obj;
96a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
97a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
98a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid typedefStructFunc() {
99a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // expected-warning@+1{{Excessive padding in 'S' (6 padding bytes, where 2 is optimal)}}
100a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  typedef struct {
101a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    char c1;
102a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    int t;
103a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    char c2;
104a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  } S;
105a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  S obj;
106a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
107a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
108a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct DefaultAttrAlign' (22 padding bytes, where 6 is optimal)}}
109a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct DefaultAttrAlign {
110a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
111a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  long long i;
112a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
113a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar} __attribute__((aligned));
114a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
115a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct SmallArrayShortSandwich' (2 padding bytes, where 0 is optimal)}}
116a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct SmallArrayShortSandwich {
117a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
118a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  short s;
119a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
120a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar} ShortArray[20];
121a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
122a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'struct SmallArrayInFunc' (2 padding bytes, where 0 is optimal)}}
123a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct SmallArrayInFunc {
124a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
125a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  short s;
126a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
127a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
128a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
129a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid arrayHolder() {
130a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct SmallArrayInFunc Arr[15];
131a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
132a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
133a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'class VirtualIntSandwich' (10 padding bytes, where 2 is optimal)}}
134a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarclass VirtualIntSandwich {
135a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  virtual void foo() {}
136a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
137a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i;
138a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
139a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
140a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
141a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// constructed so as not to have tail padding
142a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'class InnerPaddedB' (6 padding bytes, where 2 is optimal)}}
143a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarclass InnerPaddedB {
144a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
145a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i1;
146a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
147a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i2;
148a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
149a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
150a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarclass Empty {}; // no-warning
151a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
152a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'class LotsOfSpace' (6 padding bytes, where 2 is optimal)}}
153a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarclass LotsOfSpace {
154a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  Empty e1;
155a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  int i;
156a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  Empty e2;
157a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
158a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
159a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-warning@+1{{Excessive padding in 'TypedefSandwich2' (6 padding bytes, where 2 is optimal)}}
160a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainartypedef struct {
161a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c1;
162a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // expected-warning@+1{{Excessive padding in 'TypedefSandwich2::NestedTypedef' (6 padding bytes, where 2 is optimal)}}
163a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  typedef struct {
164a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    char c1;
165a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    int i;
166a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    char c2;
167a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  } NestedTypedef;
168a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  NestedTypedef t;
169a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char c2;
170a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar} TypedefSandwich2;
171a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
172a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainartemplate <typename T>
173a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct Foo {
174a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // expected-warning@+1{{Excessive padding in 'struct Foo<int>::Nested' (6 padding bytes, where 2 is optimal)}}
175a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct Nested {
176a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    char c1;
177a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    T t;
178a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    char c2;
179a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  };
180a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
181a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
182a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct Holder { // no-warning
183a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  Foo<int>::Nested t1;
184a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  Foo<char>::Nested t2;
185a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
186