• Home
  • 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