Home | History | Annotate | Download | only in Layout
      1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
      2 // RUN:            | FileCheck %s
      3 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
      4 // RUN:            | FileCheck %s
      5 
      6 namespace test1 {
      7 
      8 struct A {
      9   int a;
     10 };
     11 struct B {
     12   int b;
     13 };
     14 struct C {};
     15 struct __declspec(align(16)) D {};
     16 struct __declspec(empty_bases) X : A, D, B, C {
     17 };
     18 
     19 // CHECK: *** Dumping AST Record Layout
     20 // CHECK-NEXT:          0 | struct test1::A
     21 // CHECK-NEXT:          0 |   int a
     22 // CHECK-NEXT:            | [sizeof=4, align=4,
     23 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
     24 
     25 // CHECK: *** Dumping AST Record Layout
     26 // CHECK-NEXT:          0 | struct test1::D (empty)
     27 // CHECK-NEXT:            | [sizeof=16, align=16,
     28 // CHECK-NEXT:            |  nvsize=0, nvalign=16]
     29 
     30 // CHECK: *** Dumping AST Record Layout
     31 // CHECK-NEXT:          0 | struct test1::B
     32 // CHECK-NEXT:          0 |   int b
     33 // CHECK-NEXT:            | [sizeof=4, align=4,
     34 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
     35 
     36 // CHECK: *** Dumping AST Record Layout
     37 // CHECK-NEXT:          0 | struct test1::C (empty)
     38 // CHECK-NEXT:            | [sizeof=1, align=1,
     39 // CHECK-NEXT:            |  nvsize=0, nvalign=1]
     40 
     41 // CHECK: *** Dumping AST Record Layout
     42 // CHECK-NEXT:          0 | struct test1::X
     43 // CHECK-NEXT:          0 |   struct test1::A (base)
     44 // CHECK-NEXT:          0 |     int a
     45 // CHECK-NEXT:          0 |   struct test1::D (base) (empty)
     46 // CHECK-NEXT:          0 |   struct test1::C (base) (empty)
     47 // CHECK-NEXT:          4 |   struct test1::B (base)
     48 // CHECK-NEXT:          4 |     int b
     49 // CHECK-NEXT:            | [sizeof=16, align=16,
     50 // CHECK-NEXT:            |  nvsize=16, nvalign=16]
     51 
     52 int _ = sizeof(X);
     53 }
     54 
     55 namespace test2 {
     56 struct A {
     57   int a;
     58 };
     59 struct __declspec(empty_bases) B {};
     60 struct C : A {
     61   B b;
     62 };
     63 
     64 struct D {};
     65 struct E {
     66   int e;
     67 };
     68 struct F : D, E {};
     69 
     70 struct G : C, F {};
     71 
     72 int _ = sizeof(G);
     73 
     74 // CHECK: *** Dumping AST Record Layout
     75 // CHECK-NEXT:          0 | struct test2::A
     76 // CHECK-NEXT:          0 |   int a
     77 // CHECK-NEXT:            | [sizeof=4, align=4,
     78 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
     79 
     80 // CHECK: *** Dumping AST Record Layout
     81 // CHECK-NEXT:          0 | struct test2::B (empty)
     82 // CHECK-NEXT:            | [sizeof=1, align=1,
     83 // CHECK-NEXT:            |  nvsize=0, nvalign=1]
     84 
     85 // CHECK: *** Dumping AST Record Layout
     86 // CHECK-NEXT:          0 | struct test2::C
     87 // CHECK-NEXT:          0 |   struct test2::A (base)
     88 // CHECK-NEXT:          0 |     int a
     89 // CHECK-NEXT:          4 |   struct test2::B b (empty)
     90 // CHECK-NEXT:            | [sizeof=8, align=4,
     91 // CHECK-NEXT:            |  nvsize=8, nvalign=4]
     92 
     93 // CHECK: *** Dumping AST Record Layout
     94 // CHECK-NEXT:          0 | struct test2::D (empty)
     95 // CHECK-NEXT:            | [sizeof=1, align=1,
     96 // CHECK-NEXT:            |  nvsize=0, nvalign=1]
     97 
     98 // CHECK: *** Dumping AST Record Layout
     99 // CHECK-NEXT:          0 | struct test2::E
    100 // CHECK-NEXT:          0 |   int e
    101 // CHECK-NEXT:            | [sizeof=4, align=4,
    102 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
    103 
    104 // CHECK: *** Dumping AST Record Layout
    105 // CHECK-NEXT:          0 | struct test2::F
    106 // CHECK-NEXT:          0 |   struct test2::D (base) (empty)
    107 // CHECK-NEXT:          0 |   struct test2::E (base)
    108 // CHECK-NEXT:          0 |     int e
    109 // CHECK-NEXT:            | [sizeof=4, align=4,
    110 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
    111 
    112 // CHECK: *** Dumping AST Record Layout
    113 // CHECK-NEXT:          0 | struct test2::G
    114 // CHECK-NEXT:          0 |   struct test2::C (base)
    115 // CHECK-NEXT:          0 |     struct test2::A (base)
    116 // CHECK-NEXT:          0 |       int a
    117 // CHECK-NEXT:          4 |     struct test2::B b (empty)
    118 // CHECK-NEXT:          8 |   struct test2::F (base)
    119 // CHECK-NEXT:          8 |     struct test2::D (base) (empty)
    120 // CHECK-NEXT:          8 |     struct test2::E (base)
    121 // CHECK-NEXT:          8 |       int e
    122 // CHECK-NEXT:            | [sizeof=12, align=4,
    123 // CHECK-NEXT:            |  nvsize=12, nvalign=4]
    124 }
    125 
    126 namespace test3 {
    127 struct A {
    128   int a;
    129 };
    130 struct B {};
    131 struct C : A {
    132   B b;
    133 };
    134 
    135 struct D {};
    136 struct E {
    137   int e;
    138 };
    139 struct F : D, E {};
    140 
    141 struct __declspec(empty_bases) G : C, F {};
    142 
    143 int _ = sizeof(G);
    144 
    145 // CHECK: *** Dumping AST Record Layout
    146 // CHECK-NEXT:          0 | struct test3::A
    147 // CHECK-NEXT:          0 |   int a
    148 // CHECK-NEXT:            | [sizeof=4, align=4,
    149 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
    150 
    151 // CHECK: *** Dumping AST Record Layout
    152 // CHECK-NEXT:          0 | struct test3::B (empty)
    153 // CHECK-NEXT:            | [sizeof=1, align=1,
    154 // CHECK-NEXT:            |  nvsize=0, nvalign=1]
    155 
    156 // CHECK: *** Dumping AST Record Layout
    157 // CHECK-NEXT:          0 | struct test3::C
    158 // CHECK-NEXT:          0 |   struct test3::A (base)
    159 // CHECK-NEXT:          0 |     int a
    160 // CHECK-NEXT:          4 |   struct test3::B b (empty)
    161 // CHECK-NEXT:            | [sizeof=8, align=4,
    162 // CHECK-NEXT:            |  nvsize=8, nvalign=4]
    163 
    164 // CHECK: *** Dumping AST Record Layout
    165 // CHECK-NEXT:          0 | struct test3::D (empty)
    166 // CHECK-NEXT:            | [sizeof=1, align=1,
    167 // CHECK-NEXT:            |  nvsize=0, nvalign=1]
    168 
    169 // CHECK: *** Dumping AST Record Layout
    170 // CHECK-NEXT:          0 | struct test3::E
    171 // CHECK-NEXT:          0 |   int e
    172 // CHECK-NEXT:            | [sizeof=4, align=4,
    173 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
    174 
    175 // CHECK: *** Dumping AST Record Layout
    176 // CHECK-NEXT:          0 | struct test3::F
    177 // CHECK-NEXT:          0 |   struct test3::D (base) (empty)
    178 // CHECK-NEXT:          0 |   struct test3::E (base)
    179 // CHECK-NEXT:          0 |     int e
    180 // CHECK-NEXT:            | [sizeof=4, align=4,
    181 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
    182 
    183 // CHECK: *** Dumping AST Record Layout
    184 // CHECK-NEXT:          0 | struct test3::G
    185 // CHECK-NEXT:          0 |   struct test3::C (base)
    186 // CHECK-NEXT:          0 |     struct test3::A (base)
    187 // CHECK-NEXT:          0 |       int a
    188 // CHECK-NEXT:          4 |     struct test3::B b (empty)
    189 // CHECK-NEXT:          8 |   struct test3::F (base)
    190 // CHECK-NEXT:          8 |     struct test3::D (base) (empty)
    191 // CHECK-NEXT:          8 |     struct test3::E (base)
    192 // CHECK-NEXT:          8 |       int e
    193 // CHECK-NEXT:            | [sizeof=12, align=4,
    194 // CHECK-NEXT:            |  nvsize=12, nvalign=4]
    195 }
    196 
    197 namespace test4 {
    198 struct A {
    199   int a;
    200 };
    201 struct B {};
    202 struct C : A {
    203   B b;
    204 };
    205 
    206 struct __declspec(empty_bases) D {};
    207 struct E {
    208   int e;
    209 };
    210 struct F : D, E {};
    211 
    212 struct G : C, F {};
    213 
    214 int _ = sizeof(G);
    215 
    216 // CHECK: *** Dumping AST Record Layout
    217 // CHECK-NEXT:          0 | struct test4::A
    218 // CHECK-NEXT:          0 |   int a
    219 // CHECK-NEXT:            | [sizeof=4, align=4,
    220 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
    221 
    222 // CHECK: *** Dumping AST Record Layout
    223 // CHECK-NEXT:          0 | struct test4::B (empty)
    224 // CHECK-NEXT:            | [sizeof=1, align=1,
    225 // CHECK-NEXT:            |  nvsize=0, nvalign=1]
    226 
    227 // CHECK: *** Dumping AST Record Layout
    228 // CHECK-NEXT:          0 | struct test4::C
    229 // CHECK-NEXT:          0 |   struct test4::A (base)
    230 // CHECK-NEXT:          0 |     int a
    231 // CHECK-NEXT:          4 |   struct test4::B b (empty)
    232 // CHECK-NEXT:            | [sizeof=8, align=4,
    233 // CHECK-NEXT:            |  nvsize=8, nvalign=4]
    234 
    235 // CHECK: *** Dumping AST Record Layout
    236 // CHECK-NEXT:          0 | struct test4::D (empty)
    237 // CHECK-NEXT:            | [sizeof=1, align=1,
    238 // CHECK-NEXT:            |  nvsize=0, nvalign=1]
    239 
    240 // CHECK: *** Dumping AST Record Layout
    241 // CHECK-NEXT:          0 | struct test4::E
    242 // CHECK-NEXT:          0 |   int e
    243 // CHECK-NEXT:            | [sizeof=4, align=4,
    244 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
    245 
    246 // CHECK: *** Dumping AST Record Layout
    247 // CHECK-NEXT:          0 | struct test4::F
    248 // CHECK-NEXT:          0 |   struct test4::D (base) (empty)
    249 // CHECK-NEXT:          0 |   struct test4::E (base)
    250 // CHECK-NEXT:          0 |     int e
    251 // CHECK-NEXT:            | [sizeof=4, align=4,
    252 // CHECK-NEXT:            |  nvsize=4, nvalign=4]
    253 
    254 // CHECK: *** Dumping AST Record Layout
    255 // CHECK-NEXT:          0 | struct test4::G
    256 // CHECK-NEXT:          0 |   struct test4::C (base)
    257 // CHECK-NEXT:          0 |     struct test4::A (base)
    258 // CHECK-NEXT:          0 |       int a
    259 // CHECK-NEXT:          4 |     struct test4::B b (empty)
    260 // CHECK-NEXT:          8 |   struct test4::F (base)
    261 // CHECK-NEXT:          8 |     struct test4::D (base) (empty)
    262 // CHECK-NEXT:          8 |     struct test4::E (base)
    263 // CHECK-NEXT:          8 |       int e
    264 // CHECK-NEXT:            | [sizeof=12, align=4,
    265 // CHECK-NEXT:            |  nvsize=12, nvalign=4]
    266 }
    267