| // 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:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct A |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 4:0-21 | int a |
| // CHECK-NEXT: 8:- | int |
| // CHECK-NEXT: 8:0-9 | int c |
| // CHECK-NEXT: 12:0-2 | char b |
| // CHECK-NEXT: 12:3-6 | char d |
| // CHECK-NEXT: 14 | short y |
| // CHECK-NEXT: | [sizeof=16, align=4] |
| |
| typedef struct B { |
| char x; |
| int : 0; |
| short a : 4; |
| char y; |
| } B; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct B |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 1:- | int |
| // CHECK-NEXT: 2:0-3 | short a |
| // CHECK-NEXT: 4 | char y |
| // CHECK-NEXT: | [sizeof=6, align=2] |
| |
| typedef struct C { |
| char x; |
| short a : 4; |
| int : 0; |
| char y; |
| } C; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct C |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 2:0-3 | short a |
| // CHECK-NEXT: 4:- | int |
| // CHECK-NEXT: 4 | char y |
| // CHECK-NEXT: | [sizeof=8, align=4] |
| |
| typedef struct D { |
| char x; |
| short : 0; |
| int : 0; |
| char y; |
| } D; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct D |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 1:- | short |
| // CHECK-NEXT: 1:- | int |
| // CHECK-NEXT: 1 | char y |
| // CHECK-NEXT: | [sizeof=2, align=1] |
| |
| typedef union E { |
| char x; |
| long long a : 3; |
| int b : 3; |
| long long : 0; |
| short y; |
| } E; |
| |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | union E |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 0:0-2 | long long a |
| // CHECK-NEXT: 0:0-2 | int b |
| // CHECK-NEXT: 0:- | long long |
| // CHECK-NEXT: 0 | short |
| // CHECK-NEXT: | [sizeof=8, align=2] |
| |
| 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:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct F |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 1:0-2 | char a |
| // CHECK-NEXT: 1:3-5 | char b |
| // CHECK-NEXT: 2:0-2 | char c |
| // CHECK-NEXT: 4:0-5 | short d |
| // CHECK-NEXT: 4:6-11 | short e |
| // CHECK-NEXT: 6:0-5 | short f |
| // CHECK-NEXT: 8:0-10 | short g |
| // CHECK-NEXT:10:0-10 | short h |
| // CHECK-NEXT:12:0-10 | short i |
| // CHECK-NEXT: 14 | short y |
| // CHECK-NEXT: | [sizeof=16, align=2] |
| |
| typedef union G { |
| char x; |
| int a : 3; |
| int : 0; |
| long long : 0; |
| short y; |
| } G; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | union G |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 0:0-2 | int a |
| // CHECK-NEXT: 0:- | int |
| // CHECK-NEXT: 0:- | long long |
| // CHECK-NEXT: 0 | short y |
| // CHECK-NEXT: | [sizeof=4, align=2] |
| |
| typedef struct H { |
| unsigned short a : 1; |
| unsigned char : 0; |
| unsigned long : 0; |
| unsigned short c : 1; |
| } H; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct H |
| // CHECK-NEXT: 0:0-0 | unsigned short a |
| // CHECK-NEXT: 2:- | unsigned char |
| // CHECK-NEXT: 2:- | unsigned long |
| // CHECK-NEXT: 2:0-0 | unsigned short c |
| // CHECK-NEXT: | [sizeof=4, align=2] |
| |
| typedef struct I { |
| short : 8; |
| __declspec(align(16)) short : 8; |
| } I; |
| |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct I |
| // CHECK-NEXT: 0:0-7 | short |
| // CHECK-NEXT: 1:0-7 | short |
| // CHECK-NEXT: | [sizeof=2, align=2] |
| |
| #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:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct A1 |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 1:0-21 | int a |
| // CHECK-NEXT: 5:- | int |
| // CHECK-NEXT: 5:0-9 | int c |
| // CHECK-NEXT: 9:0-2 | char b |
| // CHECK-NEXT: 9:3-6 | char d |
| // CHECK-NEXT: 10 | short y |
| // CHECK-NEXT: | [sizeof=12, align=1] |
| |
| typedef struct B1 { |
| char x; |
| int : 0; |
| short a : 4; |
| char y; |
| } B1; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct B1 |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 1:- | int |
| // CHECK-NEXT: 1:0-3 | short |
| // CHECK-NEXT: 3 | char y |
| // CHECK-NEXT: | [sizeof=4, align=1] |
| |
| typedef struct C1 { |
| char x; |
| short a : 4; |
| int : 0; |
| char y; |
| } C1; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct C1 |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 1:0-3 | short |
| // CHECK-NEXT: 3:- | int |
| // CHECK-NEXT: 3 | char y |
| // CHECK-NEXT: | [sizeof=4, align=1] |
| |
| typedef struct D1 { |
| char x; |
| short : 0; |
| int : 0; |
| char y; |
| } D1; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct D1 |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 1:- | short |
| // CHECK-NEXT: 1:- | int |
| // CHECK-NEXT: 1 | char y |
| // CHECK-NEXT: | [sizeof=2, align=1] |
| |
| typedef union E1 { |
| char x; |
| long long a : 3; |
| int b : 3; |
| long long : 0; |
| short y; |
| } E1; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | union E1 |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 0:0-2 | long long a |
| // CHECK-NEXT: 0:0-2 | int b |
| // CHECK-NEXT: 0:- | long long |
| // CHECK-NEXT: 0 | short y |
| // CHECK-NEXT: | [sizeof=8, align=1] |
| |
| 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:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct F1 |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 1:0-2 | char a |
| // CHECK-NEXT: 1:3-5 | char b |
| // CHECK-NEXT: 2:0-2 | char c |
| // CHECK-NEXT: 3:0-5 | short d |
| // CHECK-NEXT: 3:6-11 | short e |
| // CHECK-NEXT: 5:0-5 | short f |
| // CHECK-NEXT: 7:0-10 | short g |
| // CHECK-NEXT: 9:0-10 | short h |
| // CHECK-NEXT:11:0-10 | short i |
| // CHECK-NEXT: 13 | short y |
| // CHECK-NEXT: | [sizeof=15, align=1] |
| |
| typedef union G1 { |
| char x; |
| int a : 3; |
| int : 0; |
| long long : 0; |
| short y; |
| } G1; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | union G1 |
| // CHECK-NEXT: 0 | char x |
| // CHECK-NEXT: 0:0-2 | int a |
| // CHECK-NEXT: 0:- | int |
| // CHECK-NEXT: 0:- | long long |
| // CHECK-NEXT: 0 | short y |
| // CHECK-NEXT: | [sizeof=4, align=1] |
| |
| typedef struct H1 { |
| unsigned long a : 1; |
| unsigned char : 0; |
| unsigned long : 0; |
| unsigned long c : 1; |
| } H1; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct H1 |
| // CHECK-NEXT: 0:0-0 | unsigned long a |
| // CHECK-NEXT: 4:- | unsigned char |
| // CHECK-NEXT: 4:- | unsigned long |
| // CHECK-NEXT: 4:0-0 | unsigned long c |
| // CHECK-NEXT: | [sizeof=8, align=1] |
| |
| typedef struct I1 { |
| short : 8; |
| __declspec(align(16)) short : 8; |
| } I1; |
| |
| // CHECK:*** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct I1 |
| // CHECK-NEXT: 0:0-7 | short |
| // CHECK-NEXT: 1:0-7 | short |
| // CHECK-NEXT: | [sizeof=2, align=1] |
| |
| #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]; |