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 %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 %s 2>/dev/null \
      4 // RUN:            | FileCheck %s -check-prefix CHECK-X64
      5 
      6 extern "C" int printf(const char *fmt, ...);
      7 
      8 struct B0 { char a; B0() : a(0xB0) {} };
      9 struct __declspec(align(1)) B1 {};
     10 
     11 struct A : virtual B0 {};
     12 
     13 // CHECK: *** Dumping AST Record Layout
     14 // CHECK: *** Dumping AST Record Layout
     15 // CHECK-NEXT:    0 | struct A
     16 // CHECK-NEXT:    0 |   (A vbtable pointer)
     17 // CHECK-NEXT:    4 |   struct B0 (virtual base)
     18 // CHECK-NEXT:    4 |     char a
     19 // CHECK-NEXT:      | [sizeof=5, align=4
     20 // CHECK-NEXT:      |  nvsize=4, nvalign=4]
     21 // CHECK-X64: *** Dumping AST Record Layout
     22 // CHECK-X64: *** Dumping AST Record Layout
     23 // CHECK-X64-NEXT:    0 | struct A
     24 // CHECK-X64-NEXT:    0 |   (A vbtable pointer)
     25 // CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
     26 // CHECK-X64-NEXT:    8 |     char a
     27 // CHECK-X64-NEXT:      | [sizeof=16, align=8
     28 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
     29 
     30 struct __declspec(align(1)) B : virtual B0 {};
     31 
     32 // CHECK: *** Dumping AST Record Layout
     33 // CHECK-NEXT:    0 | struct B
     34 // CHECK-NEXT:    0 |   (B vbtable pointer)
     35 // CHECK-NEXT:    4 |   struct B0 (virtual base)
     36 // CHECK-NEXT:    4 |     char a
     37 // CHECK-NEXT:      | [sizeof=8, align=4
     38 // CHECK-NEXT:      |  nvsize=4, nvalign=4]
     39 // CHECK-X64: *** Dumping AST Record Layout
     40 // CHECK-X64-NEXT:    0 | struct B
     41 // CHECK-X64-NEXT:    0 |   (B vbtable pointer)
     42 // CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
     43 // CHECK-X64-NEXT:    8 |     char a
     44 // CHECK-X64-NEXT:      | [sizeof=16, align=8
     45 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
     46 
     47 struct C : virtual B0 { int a; C() : a(0xC) {} };
     48 
     49 // CHECK: *** Dumping AST Record Layout
     50 // CHECK-NEXT:    0 | struct C
     51 // CHECK-NEXT:    0 |   (C vbtable pointer)
     52 // CHECK-NEXT:    4 |   int a
     53 // CHECK-NEXT:    8 |   struct B0 (virtual base)
     54 // CHECK-NEXT:    8 |     char a
     55 // CHECK-NEXT:      | [sizeof=9, align=4
     56 // CHECK-NEXT:      |  nvsize=8, nvalign=4]
     57 // CHECK-X64: *** Dumping AST Record Layout
     58 // CHECK-X64-NEXT:    0 | struct C
     59 // CHECK-X64-NEXT:    0 |   (C vbtable pointer)
     60 // CHECK-X64-NEXT:    8 |   int a
     61 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
     62 // CHECK-X64-NEXT:   16 |     char a
     63 // CHECK-X64-NEXT:      | [sizeof=24, align=8
     64 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
     65 
     66 struct D : virtual B0 { __declspec(align(1)) int a; D() : a(0xD) {} };
     67 
     68 // CHECK: *** Dumping AST Record Layout
     69 // CHECK-NEXT:    0 | struct D
     70 // CHECK-NEXT:    0 |   (D vbtable pointer)
     71 // CHECK-NEXT:    4 |   int a
     72 // CHECK-NEXT:    8 |   struct B0 (virtual base)
     73 // CHECK-NEXT:    8 |     char a
     74 // CHECK-NEXT:      | [sizeof=12, align=4
     75 // CHECK-NEXT:      |  nvsize=8, nvalign=4]
     76 // CHECK-X64: *** Dumping AST Record Layout
     77 // CHECK-X64-NEXT:    0 | struct D
     78 // CHECK-X64-NEXT:    0 |   (D vbtable pointer)
     79 // CHECK-X64-NEXT:    8 |   int a
     80 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
     81 // CHECK-X64-NEXT:   16 |     char a
     82 // CHECK-X64-NEXT:      | [sizeof=24, align=8
     83 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
     84 
     85 struct E : virtual B0, virtual B1 {};
     86 
     87 // CHECK: *** Dumping AST Record Layout
     88 // CHECK: *** Dumping AST Record Layout
     89 // CHECK-NEXT:    0 | struct E
     90 // CHECK-NEXT:    0 |   (E vbtable pointer)
     91 // CHECK-NEXT:    4 |   struct B0 (virtual base)
     92 // CHECK-NEXT:    4 |     char a
     93 // CHECK-NEXT:    5 |   struct B1 (virtual base) (empty)
     94 // CHECK-NEXT:      | [sizeof=8, align=4
     95 // CHECK-NEXT:      |  nvsize=4, nvalign=4]
     96 // CHECK-X64: *** Dumping AST Record Layout
     97 // CHECK-X64: *** Dumping AST Record Layout
     98 // CHECK-X64-NEXT:    0 | struct E
     99 // CHECK-X64-NEXT:    0 |   (E vbtable pointer)
    100 // CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
    101 // CHECK-X64-NEXT:    8 |     char a
    102 // CHECK-X64-NEXT:    9 |   struct B1 (virtual base) (empty)
    103 // CHECK-X64-NEXT:      | [sizeof=16, align=8
    104 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
    105 
    106 struct F { char a; virtual ~F(); };
    107 
    108 // CHECK: *** Dumping AST Record Layout
    109 // CHECK-NEXT:    0 | struct F
    110 // CHECK-NEXT:    0 |   (F vftable pointer)
    111 // CHECK-NEXT:    4 |   char a
    112 // CHECK-NEXT:      | [sizeof=8, align=4
    113 // CHECK-NEXT:      |  nvsize=8, nvalign=4]
    114 // CHECK-X64: *** Dumping AST Record Layout
    115 // CHECK-X64-NEXT:    0 | struct F
    116 // CHECK-X64-NEXT:    0 |   (F vftable pointer)
    117 // CHECK-X64-NEXT:    8 |   char a
    118 // CHECK-X64-NEXT:      | [sizeof=16, align=8
    119 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
    120 
    121 int a[
    122 sizeof(A)+
    123 sizeof(B)+
    124 sizeof(C)+
    125 sizeof(D)+
    126 sizeof(E)+
    127 sizeof(F)];
    128