342 lines · c
1// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \2// RUN: | FileCheck %s3// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \4// RUN: | FileCheck %s5 6typedef struct A {7 char x;8 int a : 22;9 int : 0;10 int c : 10;11 char b : 3;12 char d: 4;13 short y;14} A;15 16// CHECK:*** Dumping AST Record Layout17// CHECK-NEXT: 0 | struct A18// CHECK-NEXT: 0 | char x19// CHECK-NEXT: 4:0-21 | int a20// CHECK-NEXT: 8:- | int21// CHECK-NEXT: 8:0-9 | int c22// CHECK-NEXT: 12:0-2 | char b23// CHECK-NEXT: 12:3-6 | char d24// CHECK-NEXT: 14 | short y25// CHECK-NEXT: | [sizeof=16, align=4]26 27typedef struct B {28 char x;29 int : 0;30 short a : 4;31 char y;32} B;33 34// CHECK:*** Dumping AST Record Layout35// CHECK-NEXT: 0 | struct B36// CHECK-NEXT: 0 | char x37// CHECK-NEXT: 1:- | int38// CHECK-NEXT: 2:0-3 | short a39// CHECK-NEXT: 4 | char y40// CHECK-NEXT: | [sizeof=6, align=2]41 42typedef struct C {43 char x;44 short a : 4;45 int : 0;46 char y;47} C;48 49// CHECK:*** Dumping AST Record Layout50// CHECK-NEXT: 0 | struct C51// CHECK-NEXT: 0 | char x52// CHECK-NEXT: 2:0-3 | short a53// CHECK-NEXT: 4:- | int54// CHECK-NEXT: 4 | char y55// CHECK-NEXT: | [sizeof=8, align=4]56 57typedef struct D {58 char x;59 short : 0;60 int : 0;61 char y;62} D;63 64// CHECK:*** Dumping AST Record Layout65// CHECK-NEXT: 0 | struct D66// CHECK-NEXT: 0 | char x67// CHECK-NEXT: 1:- | short68// CHECK-NEXT: 1:- | int69// CHECK-NEXT: 1 | char y70// CHECK-NEXT: | [sizeof=2, align=1]71 72typedef union E {73 char x;74 long long a : 3;75 int b : 3;76 long long : 0;77 short y;78} E;79 80 81// CHECK:*** Dumping AST Record Layout82// CHECK-NEXT: 0 | union E83// CHECK-NEXT: 0 | char x84// CHECK-NEXT: 0:0-2 | long long a85// CHECK-NEXT: 0:0-2 | int b86// CHECK-NEXT: 0:- | long long87// CHECK-NEXT: 0 | short88// CHECK-NEXT: | [sizeof=8, align=2]89 90typedef struct F {91 char x;92 char a : 3;93 char b : 3;94 char c : 3;95 short d : 6;96 short e : 6;97 short f : 6;98 short g : 11;99 short h : 11;100 short i : 11;101 short y;102} F;103 104// CHECK:*** Dumping AST Record Layout105// CHECK-NEXT: 0 | struct F106// CHECK-NEXT: 0 | char x107// CHECK-NEXT: 1:0-2 | char a108// CHECK-NEXT: 1:3-5 | char b109// CHECK-NEXT: 2:0-2 | char c110// CHECK-NEXT: 4:0-5 | short d111// CHECK-NEXT: 4:6-11 | short e112// CHECK-NEXT: 6:0-5 | short f113// CHECK-NEXT: 8:0-10 | short g114// CHECK-NEXT:10:0-10 | short h115// CHECK-NEXT:12:0-10 | short i116// CHECK-NEXT: 14 | short y117// CHECK-NEXT: | [sizeof=16, align=2]118 119typedef union G {120 char x;121 int a : 3;122 int : 0;123 long long : 0;124 short y;125} G;126 127// CHECK:*** Dumping AST Record Layout128// CHECK-NEXT: 0 | union G129// CHECK-NEXT: 0 | char x130// CHECK-NEXT: 0:0-2 | int a131// CHECK-NEXT: 0:- | int132// CHECK-NEXT: 0:- | long long133// CHECK-NEXT: 0 | short y134// CHECK-NEXT: | [sizeof=4, align=2]135 136typedef struct H {137 unsigned short a : 1;138 unsigned char : 0;139 unsigned long : 0;140 unsigned short c : 1;141} H;142 143// CHECK:*** Dumping AST Record Layout144// CHECK-NEXT: 0 | struct H145// CHECK-NEXT: 0:0-0 | unsigned short a146// CHECK-NEXT: 2:- | unsigned char147// CHECK-NEXT: 2:- | unsigned long148// CHECK-NEXT: 2:0-0 | unsigned short c149// CHECK-NEXT: | [sizeof=4, align=2]150 151typedef struct I {152 short : 8;153 __declspec(align(16)) short : 8;154} I;155 156 157// CHECK:*** Dumping AST Record Layout158// CHECK-NEXT: 0 | struct I159// CHECK-NEXT: 0:0-7 | short160// CHECK-NEXT: 1:0-7 | short161// CHECK-NEXT: | [sizeof=2, align=2]162 163#pragma pack(push, 1)164 165typedef struct A1 {166 char x;167 int a : 22;168 int : 0;169 int c : 10;170 char b : 3;171 char d: 4;172 short y;173} A1;174 175// CHECK:*** Dumping AST Record Layout176// CHECK-NEXT: 0 | struct A1177// CHECK-NEXT: 0 | char x178// CHECK-NEXT: 1:0-21 | int a179// CHECK-NEXT: 5:- | int180// CHECK-NEXT: 5:0-9 | int c181// CHECK-NEXT: 9:0-2 | char b182// CHECK-NEXT: 9:3-6 | char d183// CHECK-NEXT: 10 | short y184// CHECK-NEXT: | [sizeof=12, align=1]185 186typedef struct B1 {187 char x;188 int : 0;189 short a : 4;190 char y;191} B1;192 193// CHECK:*** Dumping AST Record Layout194// CHECK-NEXT: 0 | struct B1195// CHECK-NEXT: 0 | char x196// CHECK-NEXT: 1:- | int197// CHECK-NEXT: 1:0-3 | short198// CHECK-NEXT: 3 | char y199// CHECK-NEXT: | [sizeof=4, align=1]200 201typedef struct C1 {202 char x;203 short a : 4;204 int : 0;205 char y;206} C1;207 208// CHECK:*** Dumping AST Record Layout209// CHECK-NEXT: 0 | struct C1210// CHECK-NEXT: 0 | char x211// CHECK-NEXT: 1:0-3 | short212// CHECK-NEXT: 3:- | int213// CHECK-NEXT: 3 | char y214// CHECK-NEXT: | [sizeof=4, align=1]215 216typedef struct D1 {217 char x;218 short : 0;219 int : 0;220 char y;221} D1;222 223// CHECK:*** Dumping AST Record Layout224// CHECK-NEXT: 0 | struct D1225// CHECK-NEXT: 0 | char x226// CHECK-NEXT: 1:- | short227// CHECK-NEXT: 1:- | int228// CHECK-NEXT: 1 | char y229// CHECK-NEXT: | [sizeof=2, align=1]230 231typedef union E1 {232 char x;233 long long a : 3;234 int b : 3;235 long long : 0;236 short y;237} E1;238 239// CHECK:*** Dumping AST Record Layout240// CHECK-NEXT: 0 | union E1241// CHECK-NEXT: 0 | char x242// CHECK-NEXT: 0:0-2 | long long a243// CHECK-NEXT: 0:0-2 | int b244// CHECK-NEXT: 0:- | long long245// CHECK-NEXT: 0 | short y246// CHECK-NEXT: | [sizeof=8, align=1]247 248typedef struct F1 {249 char x;250 char a : 3;251 char b : 3;252 char c : 3;253 short d : 6;254 short e : 6;255 short f : 6;256 short g : 11;257 short h : 11;258 short i : 11;259 short y;260} F1;261 262// CHECK:*** Dumping AST Record Layout263// CHECK-NEXT: 0 | struct F1264// CHECK-NEXT: 0 | char x265// CHECK-NEXT: 1:0-2 | char a266// CHECK-NEXT: 1:3-5 | char b267// CHECK-NEXT: 2:0-2 | char c268// CHECK-NEXT: 3:0-5 | short d269// CHECK-NEXT: 3:6-11 | short e270// CHECK-NEXT: 5:0-5 | short f271// CHECK-NEXT: 7:0-10 | short g272// CHECK-NEXT: 9:0-10 | short h273// CHECK-NEXT:11:0-10 | short i274// CHECK-NEXT: 13 | short y275// CHECK-NEXT: | [sizeof=15, align=1]276 277typedef union G1 {278 char x;279 int a : 3;280 int : 0;281 long long : 0;282 short y;283} G1;284 285// CHECK:*** Dumping AST Record Layout286// CHECK-NEXT: 0 | union G1287// CHECK-NEXT: 0 | char x288// CHECK-NEXT: 0:0-2 | int a289// CHECK-NEXT: 0:- | int290// CHECK-NEXT: 0:- | long long291// CHECK-NEXT: 0 | short y292// CHECK-NEXT: | [sizeof=4, align=1]293 294typedef struct H1 {295 unsigned long a : 1;296 unsigned char : 0;297 unsigned long : 0;298 unsigned long c : 1;299} H1;300 301// CHECK:*** Dumping AST Record Layout302// CHECK-NEXT: 0 | struct H1303// CHECK-NEXT: 0:0-0 | unsigned long a304// CHECK-NEXT: 4:- | unsigned char305// CHECK-NEXT: 4:- | unsigned long306// CHECK-NEXT: 4:0-0 | unsigned long c307// CHECK-NEXT: | [sizeof=8, align=1]308 309typedef struct I1 {310 short : 8;311 __declspec(align(16)) short : 8;312} I1;313 314// CHECK:*** Dumping AST Record Layout315// CHECK-NEXT: 0 | struct I1316// CHECK-NEXT: 0:0-7 | short317// CHECK-NEXT: 1:0-7 | short318// CHECK-NEXT: | [sizeof=2, align=1]319 320#pragma pack(pop)321 322int x[323sizeof(A ) +324sizeof(B ) +325sizeof(C ) +326sizeof(D ) +327sizeof(E ) +328sizeof(F ) +329sizeof(G ) +330sizeof(H ) +331sizeof(I ) +332sizeof(A1) +333sizeof(B1) +334sizeof(C1) +335sizeof(D1) +336sizeof(E1) +337sizeof(F1) +338sizeof(G1) +339sizeof(H1) +340sizeof(I1) +3410];342