2014-10-27 20:37:26 +08:00
|
|
|
// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \
|
|
|
|
// RUN: | FileCheck %s
|
|
|
|
// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \
|
|
|
|
// RUN: | FileCheck %s
|
|
|
|
|
|
|
|
typedef struct A {
|
|
|
|
char x;
|
|
|
|
int a : 22;
|
|
|
|
int : 0;
|
|
|
|
int c : 10;
|
|
|
|
char b : 3;
|
|
|
|
char d: 4;
|
|
|
|
short y;
|
|
|
|
} A;
|
|
|
|
|
|
|
|
// CHECK: Type: struct A
|
|
|
|
// CHECK: Size:128
|
|
|
|
// CHECK: Alignment:32
|
|
|
|
// CHECK: FieldOffsets: [0, 32, 64, 64, 96, 99, 112]>
|
|
|
|
|
|
|
|
typedef struct B {
|
|
|
|
char x;
|
|
|
|
int : 0;
|
|
|
|
short a : 4;
|
|
|
|
char y;
|
|
|
|
} B;
|
|
|
|
|
|
|
|
// CHECK: Type: struct B
|
|
|
|
// CHECK: Size:48
|
|
|
|
// CHECK: Alignment:16
|
|
|
|
// CHECK: FieldOffsets: [0, 8, 16, 32]>
|
|
|
|
|
|
|
|
typedef struct C {
|
|
|
|
char x;
|
|
|
|
short a : 4;
|
|
|
|
int : 0;
|
|
|
|
char y;
|
|
|
|
} C;
|
|
|
|
|
|
|
|
// CHECK: Type: struct C
|
|
|
|
// CHECK: Size:64
|
|
|
|
// CHECK: Alignment:32
|
|
|
|
// CHECK: FieldOffsets: [0, 16, 32, 32]>
|
|
|
|
|
|
|
|
typedef struct D {
|
|
|
|
char x;
|
|
|
|
short : 0;
|
|
|
|
int : 0;
|
|
|
|
char y;
|
|
|
|
} D;
|
|
|
|
|
|
|
|
// CHECK: Type: struct D
|
|
|
|
// CHECK: Size:16
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 8, 8, 8]>
|
|
|
|
|
|
|
|
typedef union E {
|
|
|
|
char x;
|
|
|
|
long long a : 3;
|
|
|
|
int b : 3;
|
|
|
|
long long : 0;
|
|
|
|
short y;
|
|
|
|
} E;
|
|
|
|
|
|
|
|
// CHECK: Type: union E
|
|
|
|
// CHECK: Size:64
|
|
|
|
// CHECK: Alignment:16
|
|
|
|
// CHECK: FieldOffsets: [0, 0, 0, 0, 0]>
|
|
|
|
|
|
|
|
typedef struct F {
|
|
|
|
char x;
|
|
|
|
char a : 3;
|
|
|
|
char b : 3;
|
|
|
|
char c : 3;
|
|
|
|
short d : 6;
|
|
|
|
short e : 6;
|
|
|
|
short f : 6;
|
|
|
|
short g : 11;
|
|
|
|
short h : 11;
|
|
|
|
short i : 11;
|
|
|
|
short y;
|
|
|
|
} F;
|
|
|
|
|
|
|
|
// CHECK: Type: struct F
|
|
|
|
// CHECK: Size:128
|
|
|
|
// CHECK: Alignment:16
|
|
|
|
// CHECK: FieldOffsets: [0, 8, 11, 16, 32, 38, 48, 64, 80, 96, 112]>
|
|
|
|
|
|
|
|
typedef union G {
|
|
|
|
char x;
|
|
|
|
int a : 3;
|
|
|
|
int : 0;
|
|
|
|
long long : 0;
|
|
|
|
short y;
|
|
|
|
} G;
|
|
|
|
|
|
|
|
// CHECK: Type: union G
|
|
|
|
// CHECK: Size:32
|
|
|
|
// CHECK: Alignment:16
|
|
|
|
// CHECK: FieldOffsets: [0, 0, 0, 0, 0]>
|
|
|
|
|
|
|
|
typedef struct H {
|
|
|
|
unsigned short a : 1;
|
|
|
|
unsigned char : 0;
|
|
|
|
unsigned long : 0;
|
|
|
|
unsigned short c : 1;
|
|
|
|
} H;
|
|
|
|
|
|
|
|
// CHECK: Type: struct H
|
|
|
|
// CHECK: Size:32
|
|
|
|
// CHECK: Alignment:16
|
|
|
|
// CHECK: FieldOffsets: [0, 16, 16, 16]>
|
|
|
|
|
|
|
|
typedef struct I {
|
|
|
|
short : 8;
|
|
|
|
__declspec(align(16)) short : 8;
|
|
|
|
} I;
|
|
|
|
|
|
|
|
// CHECK: Type: struct I
|
|
|
|
// CHECK: Size:16
|
|
|
|
// CHECK: Alignment:16
|
|
|
|
// CHECK: FieldOffsets: [0, 8]
|
|
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
|
|
|
|
typedef struct A1 {
|
|
|
|
char x;
|
|
|
|
int a : 22;
|
|
|
|
int : 0;
|
|
|
|
int c : 10;
|
|
|
|
char b : 3;
|
|
|
|
char d: 4;
|
|
|
|
short y;
|
|
|
|
} A1;
|
|
|
|
|
|
|
|
// CHECK: Type: struct A1
|
|
|
|
// CHECK: Size:96
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 8, 40, 40, 72, 75, 80]>
|
|
|
|
|
|
|
|
typedef struct B1 {
|
|
|
|
char x;
|
|
|
|
int : 0;
|
|
|
|
short a : 4;
|
|
|
|
char y;
|
|
|
|
} B1;
|
|
|
|
|
|
|
|
// CHECK: Type: struct B1
|
|
|
|
// CHECK: Size:32
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 8, 8, 24]>
|
|
|
|
|
|
|
|
typedef struct C1 {
|
|
|
|
char x;
|
|
|
|
short a : 4;
|
|
|
|
int : 0;
|
|
|
|
char y;
|
|
|
|
} C1;
|
|
|
|
|
|
|
|
// CHECK: Type: struct C1
|
|
|
|
// CHECK: Size:32
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 8, 24, 24]>
|
|
|
|
|
|
|
|
typedef struct D1 {
|
|
|
|
char x;
|
|
|
|
short : 0;
|
|
|
|
int : 0;
|
|
|
|
char y;
|
|
|
|
} D1;
|
|
|
|
|
|
|
|
// CHECK: Type: struct D1
|
|
|
|
// CHECK: Size:16
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 8, 8, 8]>
|
|
|
|
|
|
|
|
typedef union E1 {
|
|
|
|
char x;
|
|
|
|
long long a : 3;
|
|
|
|
int b : 3;
|
|
|
|
long long : 0;
|
|
|
|
short y;
|
|
|
|
} E1;
|
|
|
|
|
|
|
|
// CHECK: Type: union E1
|
|
|
|
// CHECK: Size:64
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 0, 0, 0, 0]>
|
|
|
|
|
|
|
|
typedef struct F1 {
|
|
|
|
char x;
|
|
|
|
char a : 3;
|
|
|
|
char b : 3;
|
|
|
|
char c : 3;
|
|
|
|
short d : 6;
|
|
|
|
short e : 6;
|
|
|
|
short f : 6;
|
|
|
|
short g : 11;
|
|
|
|
short h : 11;
|
|
|
|
short i : 11;
|
|
|
|
short y;
|
|
|
|
} F1;
|
|
|
|
|
|
|
|
// CHECK: Type: struct F1
|
|
|
|
// CHECK: Size:120
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 8, 11, 16, 24, 30, 40, 56, 72, 88, 104]>
|
|
|
|
|
|
|
|
typedef union G1 {
|
|
|
|
char x;
|
|
|
|
int a : 3;
|
|
|
|
int : 0;
|
|
|
|
long long : 0;
|
|
|
|
short y;
|
|
|
|
} G1;
|
|
|
|
|
|
|
|
// CHECK: Type: union G1
|
|
|
|
// CHECK: Size:32
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 0, 0, 0, 0]>
|
|
|
|
|
|
|
|
typedef struct H1 {
|
|
|
|
unsigned long a : 1;
|
|
|
|
unsigned char : 0;
|
|
|
|
unsigned long : 0;
|
|
|
|
unsigned long c : 1;
|
|
|
|
} H1;
|
|
|
|
|
|
|
|
// CHECK: Type: struct H1
|
|
|
|
// CHECK: Size:64
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 32, 32, 32]>
|
|
|
|
|
|
|
|
typedef struct I1 {
|
|
|
|
short : 8;
|
|
|
|
__declspec(align(16)) short : 8;
|
|
|
|
} I1;
|
|
|
|
|
|
|
|
// CHECK: Type: struct I1
|
|
|
|
// CHECK: Size:16
|
|
|
|
// CHECK: Alignment:8
|
|
|
|
// CHECK: FieldOffsets: [0, 8]
|
|
|
|
|
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
|
|
int x[
|
|
|
|
sizeof(A ) +
|
|
|
|
sizeof(B ) +
|
|
|
|
sizeof(C ) +
|
|
|
|
sizeof(D ) +
|
|
|
|
sizeof(E ) +
|
|
|
|
sizeof(F ) +
|
|
|
|
sizeof(G ) +
|
|
|
|
sizeof(H ) +
|
|
|
|
sizeof(I ) +
|
|
|
|
sizeof(A1) +
|
|
|
|
sizeof(B1) +
|
|
|
|
sizeof(C1) +
|
|
|
|
sizeof(D1) +
|
|
|
|
sizeof(E1) +
|
|
|
|
sizeof(F1) +
|
|
|
|
sizeof(G1) +
|
|
|
|
sizeof(H1) +
|
|
|
|
sizeof(I1) +
|
|
|
|
0];
|