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 Liauto lambda1 = [ c1 = G.c1, i = G.i, c2 = G.c2 ]{}; __anonf3d57e070402null202*67e74705SXin Liauto lambda2 = [ i = G.i, c1 = G.c1, c2 = G.c2 ]{}; // no-warning 203