269 lines · c
1// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \2// RUN: -fsyntax-only -fxl-pragma-pack -x c %s | \3// RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s4// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \5// RUN: -fsyntax-only -fxl-pragma-pack -x c++ %s | \6// RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s7 8// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \9// RUN: -fsyntax-only -fxl-pragma-pack -x c %s | \10// RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s11// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \12// RUN: -fsyntax-only -fxl-pragma-pack -x c++ %s | \13// RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s14 15struct A {16 unsigned char c : 2;17} A;18 19int a = sizeof(A);20 21// CHECK: *** Dumping AST Record Layout22// CHECK-NEXT: 0 | struct A23// CHECK-NEXT: 0:0-1 | unsigned char c24// CHECK-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=425 26struct B {27 char c;28 int : 0;29} B;30 31int b = sizeof(B);32 33// CHECK: *** Dumping AST Record Layout34// CHECK-NEXT: 0 | struct B35// CHECK-NEXT: 0 | char c36// CHECK-NEXT: 4:- | int37// CHECK-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=438 39struct C {40 signed int a1 : 6;41 signed char a2 : 4;42 short int a3 : 2;43 int a4 : 2;44 signed long a5 : 5;45 long long int a6 : 6;46 unsigned long a7 : 8;47} C;48 49int c = sizeof(C);50 51// CHECK: *** Dumping AST Record Layout52// CHECK-NEXT: 0 | struct C53// CHECK-NEXT: 0:0-5 | int a154// CHECK-NEXT: 0:6-9 | signed char a255// CHECK-NEXT: 1:2-3 | short a356// CHECK-NEXT: 1:4-5 | int a457// CHECK-NEXT: 1:6-10 | long a558// CHECK-NEXT: 2:3-8 | long long a659// CHECK32: 4:0-7 | unsigned long a760// CHECK32: sizeof=8, {{(dsize=8, )?}}align=4, preferredalign=461// CHECK64: 3:1-8 | unsigned long a762// CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=863 64#pragma align(packed)65struct C1 {66 signed int a1 : 6;67 signed char a2 : 4;68 short int a3 : 2;69 int a4 : 2;70 signed long a5 : 5;71 long long int a6 : 6;72 unsigned long a7 : 8;73} C1;74#pragma align(reset)75 76int c1 = sizeof(C1);77 78// CHECK: *** Dumping AST Record Layout79// CHECK-NEXT: 0 | struct C180// CHECK-NEXT: 0:0-5 | int a181// CHECK-NEXT: 0:6-9 | signed char a282// CHECK-NEXT: 1:2-3 | short a383// CHECK-NEXT: 1:4-5 | int a484// CHECK-NEXT: 1:6-10 | long a585// CHECK-NEXT: 2:3-8 | long long a686// CHECK-NEXT: 3:1-8 | unsigned long a787// CHECK-NEXT: sizeof=5, {{(dsize=5, )?}}align=1, preferredalign=188 89#pragma pack(4)90struct C2 {91 signed int a1 : 6;92 signed char a2 : 4;93 short int a3 : 2;94 int a4 : 2;95 signed long a5 : 5;96 long long int a6 : 6;97 unsigned long a7 : 8;98} C2;99#pragma pack(pop)100 101int c2 = sizeof(C2);102 103// CHECK: *** Dumping AST Record Layout104// CHECK-NEXT: 0 | struct C2105// CHECK-NEXT: 0:0-5 | int a1106// CHECK-NEXT: 0:6-9 | signed char a2107// CHECK-NEXT: 1:2-3 | short a3108// CHECK-NEXT: 1:4-5 | int a4109// CHECK-NEXT: 1:6-10 | long a5110// CHECK-NEXT: 2:3-8 | long long a6111// CHECK-NEXT: 3:1-8 | unsigned long a7112// CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=4, preferredalign=4113 114typedef __attribute__((aligned(32))) short mySHORT;115struct D {116 char c : 8;117 mySHORT : 0;118} D;119 120int d = sizeof(D);121 122// CHECK: *** Dumping AST Record Layout123// CHECK-NEXT: 0 | struct D124// CHECK-NEXT: 0:0-7 | char c125// CHECK-NEXT: 32:- | mySHORT126// CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32127 128typedef __attribute__((aligned(32))) long myLONG;129struct D11 {130 char c : 8;131 myLONG : 0;132} D11;133 134int d11 = sizeof(D11);135 136// CHECK: *** Dumping AST Record Layout137// CHECK-NEXT: 0 | struct D11138// CHECK-NEXT: 0:0-7 | char c139// CHECK-NEXT: 32:- | myLONG140// CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32141 142typedef __attribute__((aligned(2))) long myLONG2;143struct D12 {144 char c : 8;145 myLONG2 : 0;146} D12;147 148int d12 = sizeof(D12);149 150// CHECK: *** Dumping AST Record Layout151// CHECK-NEXT: 0 | struct D12152// CHECK-NEXT: 0:0-7 | char c153// CHECK32: 4:- | myLONG2154// CHECK32: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4155// CHECK64: 8:- | myLONG2156// CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8157 158typedef __attribute__((aligned(32))) long long myLONGLONG;159struct D21 {160 char c : 8;161 myLONGLONG : 0;162} D21;163 164int d21 = sizeof(D21);165 166// CHECK: *** Dumping AST Record Layout167// CHECK-NEXT: 0 | struct D21168// CHECK-NEXT: 0:0-7 | char c169// CHECK-NEXT: 32:- | myLONGLONG170// CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32171 172typedef __attribute__((aligned(2))) long long myLONGLONG2;173struct D22 {174 char c : 8;175 myLONGLONG2 : 0;176} D22;177 178int d22 = sizeof(D22);179 180// CHECK: *** Dumping AST Record Layout181// CHECK-NEXT: 0 | struct D22182// CHECK-NEXT: 0:0-7 | char c183// CHECK32: 4:- | myLONGLONG2184// CHECK32: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4185// CHECK64: 8:- | myLONGLONG2186// CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8187 188enum LL : unsigned long long { val = 1 };189 190struct E {191 enum LL e : 32;192} E;193 194int e = sizeof(E);195 196// CHECK: *** Dumping AST Record Layout197// CHECK-NEXT: 0 | struct E198// CHECK-NEXT: 0:0-31 | enum LL e199// CHECK32-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4200// CHECK64-NEXT: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8201 202enum LL1 : unsigned long long { val1 = 1 } __attribute__((aligned(16)));203struct E1 {204 enum LL1 e : 32;205} E1;206 207int e1 = sizeof(E1);208 209// CHECK: *** Dumping AST Record Layout210// CHECK-NEXT: 0 | struct E1211// CHECK-NEXT: 0:0-31 | enum LL1 e212// CHECK-NEXT: sizeof=16, {{(dsize=16, )?}}align=16, preferredalign=16213 214struct F {215 long long l : 32 __attribute__((aligned(16)));216} F;217 218int f = sizeof(F);219 220// CHECK: *** Dumping AST Record Layout221// CHECK-NEXT: 0 | struct F222// CHECK-NEXT: 0:0-31 | long long l223// CHECK-NEXT: sizeof=16, {{(dsize=16, )?}}align=16, preferredalign=16224 225struct G {226 long long ll : 45;227} G;228 229int s = sizeof(G);230 231// CHECK: *** Dumping AST Record Layout232// CHECK-NEXT: 0 | struct G233// CHECK-NEXT: 0:0-44 | long long ll234// CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8235 236#pragma align(packed)237struct H {238 char c;239 int : 0;240 int i;241} H;242#pragma align(reset)243 244int h = sizeof(H);245 246// CHECK: *** Dumping AST Record Layout247// CHECK-NEXT: 0 | struct H248// CHECK-NEXT: 0 | char c249// CHECK-NEXT: 4:- | int250// CHECK-NEXT: 4 | int i251// CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=1, preferredalign=1252 253#pragma pack(2)254struct I {255 char c;256 int : 0;257 int i;258} I;259#pragma pack(pop)260 261int i = sizeof(I);262 263// CHECK: *** Dumping AST Record Layout264// CHECK-NEXT: 0 | struct I265// CHECK-NEXT: 0 | char c266// CHECK-NEXT: 4:- | int267// CHECK-NEXT: 4 | int i268// CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=2, preferredalign=2269