// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \ // RUN: -fsyntax-only -fxl-pragma-pack -x c %s | \ // RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \ // RUN: -fsyntax-only -fxl-pragma-pack -x c++ %s | \ // RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \ // RUN: -fsyntax-only -fxl-pragma-pack -x c %s | \ // RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \ // RUN: -fsyntax-only -fxl-pragma-pack -x c++ %s | \ // RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s struct A { unsigned char c : 2; } A; int a = sizeof(A); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct A // CHECK-NEXT: 0:0-1 | unsigned char c // CHECK-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4 struct B { char c; int : 0; } B; int b = sizeof(B); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct B // CHECK-NEXT: 0 | char c // CHECK-NEXT: 4:- | int // CHECK-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4 struct C { signed int a1 : 6; signed char a2 : 4; short int a3 : 2; int a4 : 2; signed long a5 : 5; long long int a6 : 6; unsigned long a7 : 8; } C; int c = sizeof(C); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct C // CHECK-NEXT: 0:0-5 | int a1 // CHECK-NEXT: 0:6-9 | signed char a2 // CHECK-NEXT: 1:2-3 | short a3 // CHECK-NEXT: 1:4-5 | int a4 // CHECK-NEXT: 1:6-10 | long a5 // CHECK-NEXT: 2:3-8 | long long a6 // CHECK32: 4:0-7 | unsigned long a7 // CHECK32: sizeof=8, {{(dsize=8, )?}}align=4, preferredalign=4 // CHECK64: 3:1-8 | unsigned long a7 // CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8 #pragma align(packed) struct C1 { signed int a1 : 6; signed char a2 : 4; short int a3 : 2; int a4 : 2; signed long a5 : 5; long long int a6 : 6; unsigned long a7 : 8; } C1; #pragma align(reset) int c1 = sizeof(C1); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct C1 // CHECK-NEXT: 0:0-5 | int a1 // CHECK-NEXT: 0:6-9 | signed char a2 // CHECK-NEXT: 1:2-3 | short a3 // CHECK-NEXT: 1:4-5 | int a4 // CHECK-NEXT: 1:6-10 | long a5 // CHECK-NEXT: 2:3-8 | long long a6 // CHECK-NEXT: 3:1-8 | unsigned long a7 // CHECK-NEXT: sizeof=5, {{(dsize=5, )?}}align=1, preferredalign=1 #pragma pack(4) struct C2 { signed int a1 : 6; signed char a2 : 4; short int a3 : 2; int a4 : 2; signed long a5 : 5; long long int a6 : 6; unsigned long a7 : 8; } C2; #pragma pack(pop) int c2 = sizeof(C2); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct C2 // CHECK-NEXT: 0:0-5 | int a1 // CHECK-NEXT: 0:6-9 | signed char a2 // CHECK-NEXT: 1:2-3 | short a3 // CHECK-NEXT: 1:4-5 | int a4 // CHECK-NEXT: 1:6-10 | long a5 // CHECK-NEXT: 2:3-8 | long long a6 // CHECK-NEXT: 3:1-8 | unsigned long a7 // CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=4, preferredalign=4 typedef __attribute__((aligned(32))) short mySHORT; struct D { char c : 8; mySHORT : 0; } D; int d = sizeof(D); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct D // CHECK-NEXT: 0:0-7 | char c // CHECK-NEXT: 32:- | mySHORT // CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32 typedef __attribute__((aligned(32))) long myLONG; struct D11 { char c : 8; myLONG : 0; } D11; int d11 = sizeof(D11); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct D11 // CHECK-NEXT: 0:0-7 | char c // CHECK-NEXT: 32:- | myLONG // CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32 typedef __attribute__((aligned(2))) long myLONG2; struct D12 { char c : 8; myLONG2 : 0; } D12; int d12 = sizeof(D12); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct D12 // CHECK-NEXT: 0:0-7 | char c // CHECK32: 4:- | myLONG2 // CHECK32: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4 // CHECK64: 8:- | myLONG2 // CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8 typedef __attribute__((aligned(32))) long long myLONGLONG; struct D21 { char c : 8; myLONGLONG : 0; } D21; int d21 = sizeof(D21); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct D21 // CHECK-NEXT: 0:0-7 | char c // CHECK-NEXT: 32:- | myLONGLONG // CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32 typedef __attribute__((aligned(2))) long long myLONGLONG2; struct D22 { char c : 8; myLONGLONG2 : 0; } D22; int d22 = sizeof(D22); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct D22 // CHECK-NEXT: 0:0-7 | char c // CHECK32: 4:- | myLONGLONG2 // CHECK32: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4 // CHECK64: 8:- | myLONGLONG2 // CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8 enum LL : unsigned long long { val = 1 }; struct E { enum LL e : 32; } E; int e = sizeof(E); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct E // CHECK-NEXT: 0:0-31 | enum LL e // CHECK32-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4 // CHECK64-NEXT: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8 enum LL1 : unsigned long long { val1 = 1 } __attribute__((aligned(16))); struct E1 { enum LL1 e : 32; } E1; int e1 = sizeof(E1); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct E1 // CHECK-NEXT: 0:0-31 | enum LL1 e // CHECK-NEXT: sizeof=16, {{(dsize=16, )?}}align=16, preferredalign=16 struct F { long long l : 32 __attribute__((aligned(16))); } F; int f = sizeof(F); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct F // CHECK-NEXT: 0:0-31 | long long l // CHECK-NEXT: sizeof=16, {{(dsize=16, )?}}align=16, preferredalign=16 struct G { long long ll : 45; } G; int s = sizeof(G); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct G // CHECK-NEXT: 0:0-44 | long long ll // CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8 #pragma align(packed) struct H { char c; int : 0; int i; } H; #pragma align(reset) int h = sizeof(H); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct H // CHECK-NEXT: 0 | char c // CHECK-NEXT: 4:- | int // CHECK-NEXT: 4 | int i // CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=1, preferredalign=1 #pragma pack(2) struct I { char c; int : 0; int i; } I; #pragma pack(pop) int i = sizeof(I); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct I // CHECK-NEXT: 0 | char c // CHECK-NEXT: 4:- | int // CHECK-NEXT: 4 | int i // CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=2, preferredalign=2