338 lines · cpp
1// RUN: %clang_cc1 -fno-rtti -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \2// RUN: | FileCheck %s3// RUN: %clang_cc1 -fno-rtti -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \4// RUN: | FileCheck %s5// RUN: %clang_cc1 -fno-rtti -triple amdgcn-amd-amdhsa -fms-extensions \6// RUN: -target-cpu gfx1200 -aux-triple x86_64-pc-win32 -fcuda-is-device \7// RUN: -fdump-record-layouts -fsyntax-only -xhip %s 2>/dev/null \8// RUN: | FileCheck %s9// RUN: %clang_cc1 -fno-rtti -triple spirv64-amd-amdhsa -fms-extensions \10// RUN: -aux-triple x86_64-pc-win32 -fcuda-is-device \11// RUN: -fdump-record-layouts -fsyntax-only -xhip %s 2>/dev/null \12// RUN: | FileCheck %s13// RUN: %clang_cc1 -fno-rtti -triple nvptx64 -fms-extensions \14// RUN: -aux-triple x86_64-pc-win32 -fcuda-is-device -fdump-record-layouts \15// RUN: -fsyntax-only -xcuda %s 2>/dev/null | FileCheck %s16 17namespace test1 {18 19struct A {20 int a;21};22struct B {23 int b;24};25struct C {};26struct __declspec(align(16)) D {};27struct __declspec(empty_bases) X : A, D, B, C {28};29 30// CHECK: *** Dumping AST Record Layout31// CHECK-NEXT: 0 | struct test1::A32// CHECK-NEXT: 0 | int a33// CHECK-NEXT: | [sizeof=4, align=4,34// CHECK-NEXT: | nvsize=4, nvalign=4]35 36// CHECK: *** Dumping AST Record Layout37// CHECK-NEXT: 0 | struct test1::D (empty)38// CHECK-NEXT: | [sizeof=16, align=16,39// CHECK-NEXT: | nvsize=0, nvalign=16]40 41// CHECK: *** Dumping AST Record Layout42// CHECK-NEXT: 0 | struct test1::B43// CHECK-NEXT: 0 | int b44// CHECK-NEXT: | [sizeof=4, align=4,45// CHECK-NEXT: | nvsize=4, nvalign=4]46 47// CHECK: *** Dumping AST Record Layout48// CHECK-NEXT: 0 | struct test1::C (empty)49// CHECK-NEXT: | [sizeof=1, align=1,50// CHECK-NEXT: | nvsize=0, nvalign=1]51 52// CHECK: *** Dumping AST Record Layout53// CHECK-NEXT: 0 | struct test1::X54// CHECK-NEXT: 0 | struct test1::A (base)55// CHECK-NEXT: 0 | int a56// CHECK-NEXT: 0 | struct test1::D (base) (empty)57// CHECK-NEXT: 0 | struct test1::C (base) (empty)58// CHECK-NEXT: 4 | struct test1::B (base)59// CHECK-NEXT: 4 | int b60// CHECK-NEXT: | [sizeof=16, align=16,61// CHECK-NEXT: | nvsize=16, nvalign=16]62 63int _ = sizeof(X);64}65 66namespace test2 {67struct A {68 int a;69};70struct __declspec(empty_bases) B {};71struct C : A {72 B b;73};74 75struct D {};76struct E {77 int e;78};79struct F : D, E {};80 81struct G : C, F {};82 83int _ = sizeof(G);84 85// CHECK: *** Dumping AST Record Layout86// CHECK-NEXT: 0 | struct test2::A87// CHECK-NEXT: 0 | int a88// CHECK-NEXT: | [sizeof=4, align=4,89// CHECK-NEXT: | nvsize=4, nvalign=4]90 91// CHECK: *** Dumping AST Record Layout92// CHECK-NEXT: 0 | struct test2::B (empty)93// CHECK-NEXT: | [sizeof=1, align=1,94// CHECK-NEXT: | nvsize=0, nvalign=1]95 96// CHECK: *** Dumping AST Record Layout97// CHECK-NEXT: 0 | struct test2::C98// CHECK-NEXT: 0 | struct test2::A (base)99// CHECK-NEXT: 0 | int a100// CHECK-NEXT: 4 | struct test2::B b (empty)101// CHECK-NEXT: | [sizeof=8, align=4,102// CHECK-NEXT: | nvsize=8, nvalign=4]103 104// CHECK: *** Dumping AST Record Layout105// CHECK-NEXT: 0 | struct test2::D (empty)106// CHECK-NEXT: | [sizeof=1, align=1,107// CHECK-NEXT: | nvsize=0, nvalign=1]108 109// CHECK: *** Dumping AST Record Layout110// CHECK-NEXT: 0 | struct test2::E111// CHECK-NEXT: 0 | int e112// CHECK-NEXT: | [sizeof=4, align=4,113// CHECK-NEXT: | nvsize=4, nvalign=4]114 115// CHECK: *** Dumping AST Record Layout116// CHECK-NEXT: 0 | struct test2::F117// CHECK-NEXT: 0 | struct test2::D (base) (empty)118// CHECK-NEXT: 0 | struct test2::E (base)119// CHECK-NEXT: 0 | int e120// CHECK-NEXT: | [sizeof=4, align=4,121// CHECK-NEXT: | nvsize=4, nvalign=4]122 123// CHECK: *** Dumping AST Record Layout124// CHECK-NEXT: 0 | struct test2::G125// CHECK-NEXT: 0 | struct test2::C (base)126// CHECK-NEXT: 0 | struct test2::A (base)127// CHECK-NEXT: 0 | int a128// CHECK-NEXT: 4 | struct test2::B b (empty)129// CHECK-NEXT: 8 | struct test2::F (base)130// CHECK-NEXT: 8 | struct test2::D (base) (empty)131// CHECK-NEXT: 8 | struct test2::E (base)132// CHECK-NEXT: 8 | int e133// CHECK-NEXT: | [sizeof=12, align=4,134// CHECK-NEXT: | nvsize=12, nvalign=4]135}136 137namespace test3 {138struct A {139 int a;140};141struct B {};142struct C : A {143 B b;144};145 146struct D {};147struct E {148 int e;149};150struct F : D, E {};151 152struct __declspec(empty_bases) G : C, F {};153 154int _ = sizeof(G);155 156// CHECK: *** Dumping AST Record Layout157// CHECK-NEXT: 0 | struct test3::A158// CHECK-NEXT: 0 | int a159// CHECK-NEXT: | [sizeof=4, align=4,160// CHECK-NEXT: | nvsize=4, nvalign=4]161 162// CHECK: *** Dumping AST Record Layout163// CHECK-NEXT: 0 | struct test3::B (empty)164// CHECK-NEXT: | [sizeof=1, align=1,165// CHECK-NEXT: | nvsize=0, nvalign=1]166 167// CHECK: *** Dumping AST Record Layout168// CHECK-NEXT: 0 | struct test3::C169// CHECK-NEXT: 0 | struct test3::A (base)170// CHECK-NEXT: 0 | int a171// CHECK-NEXT: 4 | struct test3::B b (empty)172// CHECK-NEXT: | [sizeof=8, align=4,173// CHECK-NEXT: | nvsize=8, nvalign=4]174 175// CHECK: *** Dumping AST Record Layout176// CHECK-NEXT: 0 | struct test3::D (empty)177// CHECK-NEXT: | [sizeof=1, align=1,178// CHECK-NEXT: | nvsize=0, nvalign=1]179 180// CHECK: *** Dumping AST Record Layout181// CHECK-NEXT: 0 | struct test3::E182// CHECK-NEXT: 0 | int e183// CHECK-NEXT: | [sizeof=4, align=4,184// CHECK-NEXT: | nvsize=4, nvalign=4]185 186// CHECK: *** Dumping AST Record Layout187// CHECK-NEXT: 0 | struct test3::F188// CHECK-NEXT: 0 | struct test3::D (base) (empty)189// CHECK-NEXT: 0 | struct test3::E (base)190// CHECK-NEXT: 0 | int e191// CHECK-NEXT: | [sizeof=4, align=4,192// CHECK-NEXT: | nvsize=4, nvalign=4]193 194// CHECK: *** Dumping AST Record Layout195// CHECK-NEXT: 0 | struct test3::G196// CHECK-NEXT: 0 | struct test3::C (base)197// CHECK-NEXT: 0 | struct test3::A (base)198// CHECK-NEXT: 0 | int a199// CHECK-NEXT: 4 | struct test3::B b (empty)200// CHECK-NEXT: 8 | struct test3::F (base)201// CHECK-NEXT: 8 | struct test3::D (base) (empty)202// CHECK-NEXT: 8 | struct test3::E (base)203// CHECK-NEXT: 8 | int e204// CHECK-NEXT: | [sizeof=12, align=4,205// CHECK-NEXT: | nvsize=12, nvalign=4]206}207 208namespace test4 {209struct A {210 int a;211};212struct B {};213struct C : A {214 B b;215};216 217struct __declspec(empty_bases) D {};218struct E {219 int e;220};221struct F : D, E {};222 223struct G : C, F {};224 225int _ = sizeof(G);226 227// CHECK: *** Dumping AST Record Layout228// CHECK-NEXT: 0 | struct test4::A229// CHECK-NEXT: 0 | int a230// CHECK-NEXT: | [sizeof=4, align=4,231// CHECK-NEXT: | nvsize=4, nvalign=4]232 233// CHECK: *** Dumping AST Record Layout234// CHECK-NEXT: 0 | struct test4::B (empty)235// CHECK-NEXT: | [sizeof=1, align=1,236// CHECK-NEXT: | nvsize=0, nvalign=1]237 238// CHECK: *** Dumping AST Record Layout239// CHECK-NEXT: 0 | struct test4::C240// CHECK-NEXT: 0 | struct test4::A (base)241// CHECK-NEXT: 0 | int a242// CHECK-NEXT: 4 | struct test4::B b (empty)243// CHECK-NEXT: | [sizeof=8, align=4,244// CHECK-NEXT: | nvsize=8, nvalign=4]245 246// CHECK: *** Dumping AST Record Layout247// CHECK-NEXT: 0 | struct test4::D (empty)248// CHECK-NEXT: | [sizeof=1, align=1,249// CHECK-NEXT: | nvsize=0, nvalign=1]250 251// CHECK: *** Dumping AST Record Layout252// CHECK-NEXT: 0 | struct test4::E253// CHECK-NEXT: 0 | int e254// CHECK-NEXT: | [sizeof=4, align=4,255// CHECK-NEXT: | nvsize=4, nvalign=4]256 257// CHECK: *** Dumping AST Record Layout258// CHECK-NEXT: 0 | struct test4::F259// CHECK-NEXT: 0 | struct test4::D (base) (empty)260// CHECK-NEXT: 0 | struct test4::E (base)261// CHECK-NEXT: 0 | int e262// CHECK-NEXT: | [sizeof=4, align=4,263// CHECK-NEXT: | nvsize=4, nvalign=4]264 265// CHECK: *** Dumping AST Record Layout266// CHECK-NEXT: 0 | struct test4::G267// CHECK-NEXT: 0 | struct test4::C (base)268// CHECK-NEXT: 0 | struct test4::A (base)269// CHECK-NEXT: 0 | int a270// CHECK-NEXT: 4 | struct test4::B b (empty)271// CHECK-NEXT: 8 | struct test4::F (base)272// CHECK-NEXT: 8 | struct test4::D (base) (empty)273// CHECK-NEXT: 8 | struct test4::E (base)274// CHECK-NEXT: 8 | int e275// CHECK-NEXT: | [sizeof=12, align=4,276// CHECK-NEXT: | nvsize=12, nvalign=4]277}278 279namespace test5 {280 281struct A {282 int a;283};284struct B {285 int b;286};287struct C {};288struct __declspec(align(16)) D {};289struct E {290 [[msvc::no_unique_address]] C c;291};292struct __declspec(empty_bases) X : A, D, B, C, E {293};294 295// CHECK: *** Dumping AST Record Layout296// CHECK-NEXT: 0 | struct test5::A297// CHECK-NEXT: 0 | int a298// CHECK-NEXT: | [sizeof=4, align=4,299// CHECK-NEXT: | nvsize=4, nvalign=4]300 301// CHECK: *** Dumping AST Record Layout302// CHECK-NEXT: 0 | struct test5::D (empty)303// CHECK-NEXT: | [sizeof=16, align=16,304// CHECK-NEXT: | nvsize=0, nvalign=16]305 306// CHECK: *** Dumping AST Record Layout307// CHECK-NEXT: 0 | struct test5::B308// CHECK-NEXT: 0 | int b309// CHECK-NEXT: | [sizeof=4, align=4,310// CHECK-NEXT: | nvsize=4, nvalign=4]311 312// CHECK: *** Dumping AST Record Layout313// CHECK-NEXT: 0 | struct test5::C (empty)314// CHECK-NEXT: | [sizeof=1, align=1,315// CHECK-NEXT: | nvsize=0, nvalign=1]316 317// CHECK: *** Dumping AST Record Layout318// CHECK-NEXT: 0 | struct test5::E (empty)319// CHECK-NEXT: 0 | struct test5::C c (empty)320// CHECK-NEXT: | [sizeof=1, align=1,321// CHECK-NEXT: | nvsize=1, nvalign=1]322 323// CHECK: *** Dumping AST Record Layout324// CHECK-NEXT: 0 | struct test5::X325// CHECK-NEXT: 0 | struct test5::A (base)326// CHECK-NEXT: 0 | int a327// CHECK-NEXT: 0 | struct test5::D (base) (empty)328// CHECK-NEXT: 0 | struct test5::C (base) (empty)329// CHECK-NEXT: 4 | struct test5::B (base)330// CHECK-NEXT: 4 | int b331// CHECK-NEXT: 8 | struct test5::E (base) (empty)332// CHECK-NEXT: 8 | struct test5::C c (empty)333// CHECK-NEXT: | [sizeof=16, align=16,334// CHECK-NEXT: | nvsize=16, nvalign=16]335 336int _ = sizeof(X);337}338