1*67e74705SXin Li // RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.layouts 2*67e74705SXin Li // RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.before 3*67e74705SXin Li // RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after 4*67e74705SXin Li // RUN: diff -u %t.before %t.after 5*67e74705SXin Li // RUN: FileCheck %s < %t.after 6*67e74705SXin Li 7*67e74705SXin Li // If not explicitly disabled, set PACKED to the packed attribute. 8*67e74705SXin Li #ifndef PACKED 9*67e74705SXin Li # define PACKED __attribute__((packed)) 10*67e74705SXin Li #endif 11*67e74705SXin Li 12*67e74705SXin Li struct Empty1 { }; 13*67e74705SXin Li struct Empty2 { }; 14*67e74705SXin Li 15*67e74705SXin Li // CHECK: Type: struct X0 16*67e74705SXin Li struct X0 : public Empty1 { 17*67e74705SXin Li int x[6] PACKED; 18*67e74705SXin Li }; 19*67e74705SXin Li 20*67e74705SXin Li // CHECK: Type: struct X1 21*67e74705SXin Li struct X1 : public X0, public Empty2 { 22*67e74705SXin Li char x[13]; 23*67e74705SXin Li struct X0 y; 24*67e74705SXin Li } PACKED; 25*67e74705SXin Li 26*67e74705SXin Li // CHECK: Type: struct X2 27*67e74705SXin Li struct PACKED X2 : public X1, public X0, public Empty1 { 28*67e74705SXin Li short x; 29*67e74705SXin Li int y; 30*67e74705SXin Li }; 31*67e74705SXin Li 32*67e74705SXin Li // CHECK: Type: struct X3 33*67e74705SXin Li struct PACKED X3 : virtual public X1, public X0 { 34*67e74705SXin Li short x; 35*67e74705SXin Li int y; 36*67e74705SXin Li }; 37*67e74705SXin Li 38*67e74705SXin Li // CHECK: Type: struct X4 39*67e74705SXin Li struct PACKED X4 { 40*67e74705SXin Li unsigned int a : 1; 41*67e74705SXin Li unsigned int b : 1; 42*67e74705SXin Li unsigned int c : 1; 43*67e74705SXin Li unsigned int d : 1; 44*67e74705SXin Li unsigned int e : 1; 45*67e74705SXin Li unsigned int f : 1; 46*67e74705SXin Li unsigned int g : 1; 47*67e74705SXin Li unsigned int h : 1; 48*67e74705SXin Li unsigned int i : 1; 49*67e74705SXin Li unsigned int j : 1; 50*67e74705SXin Li unsigned int k : 1; 51*67e74705SXin Li unsigned int l : 1; 52*67e74705SXin Li unsigned int m : 1; 53*67e74705SXin Li unsigned int n : 1; 54*67e74705SXin Li X4(); 55*67e74705SXin Li }; 56*67e74705SXin Li 57*67e74705SXin Li // CHECK: Type: struct X5 58*67e74705SXin Li struct PACKED X5 { 59*67e74705SXin Li union { 60*67e74705SXin Li long a; 61*67e74705SXin Li long b; 62*67e74705SXin Li }; 63*67e74705SXin Li short l; 64*67e74705SXin Li short r; 65*67e74705SXin Li }; 66*67e74705SXin Li use_structs()67*67e74705SXin Livoid use_structs() { 68*67e74705SXin Li X0 x0s[sizeof(X0)]; 69*67e74705SXin Li X1 x1s[sizeof(X1)]; 70*67e74705SXin Li X2 x2s[sizeof(X2)]; 71*67e74705SXin Li X3 x3s[sizeof(X3)]; 72*67e74705SXin Li X4 x4s[sizeof(X4)]; 73*67e74705SXin Li X5 x5s[sizeof(X5)]; 74*67e74705SXin Li x4s[1].a = 1; 75*67e74705SXin Li x5s[1].a = 17; 76*67e74705SXin Li } 77*67e74705SXin Li 78