• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.layouts
2  // RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after
3  // RUN: diff %t.layouts %t.after
4  // RUN: FileCheck %s < %t.after
5  
6  // If not explicitly disabled, set PACKED to the packed attribute.
7  #ifndef PACKED
8  #  define PACKED __attribute__((packed))
9  #endif
10  
11  // If not explicitly disabled, set ALIGNED16 to 16-byte alignment.
12  #ifndef ALIGNED16
13  #  define ALIGNED16 __attribute__((aligned(16)))
14  #endif
15  
16  // CHECK: Type: struct X0
17  struct X0 {
18    int x[6] PACKED;
19  };
20  
use_X0()21  void use_X0() { struct X0 x0; x0.x[5] = sizeof(struct X0); };
22  
23  // CHECK: Type: struct X1
24  struct X1 {
25    char x[13];
26    struct X0 y;
27  } PACKED;
28  
use_X1()29  void use_X1() { struct X1 x1; x1.x[5] = sizeof(struct X1); };
30  
31  // CHECK: Type: struct X2
32  struct PACKED X2 {
33    short x;
34    int y;
35  };
36  
use_X2()37  void use_X2() { struct X2 x2; x2.y = sizeof(struct X2); };
38  
39  // CHECK: Type: struct X3
40  struct X3 {
41    short x PACKED;
42    int y;
43  };
44  
use_X3()45  void use_X3() { struct X3 x3; x3.y = sizeof(struct X3); };
46  
47  #pragma pack(push,2)
48  // CHECK: Type: struct X4
49  struct X4 {
50    int x;
51    int y;
52  };
53  #pragma pack(pop)
54  
use_X4()55  void use_X4() { struct X4 x4; x4.y = sizeof(struct X4); };
56  
57  // CHECK: Type: struct X5
58  struct PACKED X5 { double a[19];  signed char b; };
59  
use_X5()60  void use_X5() { struct X5 x5; x5.b = sizeof(struct X5); };
61  
62  // CHECK: Type: struct X6
63  struct PACKED X6 { long double a; char b; };
64  
use_X6()65  void use_X6() { struct X6 x6; x6.b = sizeof(struct X6); };
66  
67  // CHECK: Type: struct X7
68  struct X7 {
69          unsigned x;
70          unsigned char y;
71  } PACKED;
72  
use_X7()73  void use_X7() { struct X7 x7; x7.y = x7.x = sizeof(struct X7); }
74  
75  // CHECK: Type: union X8
76  union X8 {
77    struct X7 x;
78    unsigned y;
79  } PACKED;
80  
81  // CHECK: Type: struct X9
82  struct X9 {
83    unsigned int x[2] PACKED;
84    unsigned int y;
85    unsigned int z PACKED;
86  };
87  
88  // CHECK: Type: struct X10
89  struct X10 {
90    unsigned int x[2] PACKED;
91    unsigned int y PACKED;
92    unsigned int z PACKED;
93  };
94  
95  // CHECK: Type: struct X11
96  struct PACKED X11 {
97    unsigned int x[2];
98    unsigned int y;
99    unsigned int z;
100  };
101  
102  // CHECK: Type: struct X12
103  struct PACKED X12 {
104    int x : 24;
105  };
106  
107  // CHECK: Type: struct X13
108  struct PACKED X13 {
109    signed x : 10;
110    signed y : 10;
111  };
112  
113  // CHECK: Type: union X14
114  union PACKED X14 {
115    unsigned long long x : 3;
116  };
117  
118  // CHECK: Type: struct X15
119  struct X15 {
120    unsigned x : 16;
121    unsigned y : 28 PACKED;
122  };
123  
124  // CHECK: Type: struct X16
125  struct ALIGNED16 X16 {
126    int a, b, c;
127    int x : 5;
128    int y : 29;
129  };
130  
use_structs()131  void use_structs() {
132    union X8 x8;
133    typedef int X8array[sizeof(union X8)];
134    x8.y = sizeof(union X8);
135    x8.x.x = x8.y;
136  
137    struct X9 x9;
138    typedef int X9array[sizeof(struct X9)];
139    x9.y = sizeof(struct X9);
140  
141    struct X10 x10;
142    typedef int X10array[sizeof(struct X10)];
143    x10.y = sizeof(struct X10);
144  
145    struct X11 x11;
146    typedef int X11array[sizeof(struct X11)];
147    x11.y = sizeof(struct X11);
148  
149    struct X12 x12;
150    x12.x = sizeof(struct X12);
151  
152    struct X13 x13;
153    x13.x = sizeof(struct X13);
154  
155    union X14 x14;
156    x14.x = sizeof(union X14);
157  
158    struct X15 x15;
159    x15.x = sizeof(struct X15);
160  
161    struct X16 x16;
162    x16.x = sizeof(struct X16);
163  }
164