xref: /aosp_15_r20/external/clang/test/CodeGenCXX/override-layout.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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