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