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