forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			342 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			342 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
| // 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];
 |