// 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