ms-x86-vfvb-sharing.cpp revision 651f13cea278ec967336033dd032faef0e9fc2ec
1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>&1 \ 2dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// RUN: | FileCheck %s 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \ 47967c95891c5f65f6312fbbcb999ac257d776914Warren Hunt// RUN: | FileCheck %s -check-prefix CHECK-X64 5dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 6dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntextern "C" int printf(const char *fmt, ...); 7dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 8dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } }; 9dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } }; 10dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct B2 { B2() { printf("B2 = %p\n", this); } virtual void g() { printf("B2"); } }; 11dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct B3 : virtual B1 { B3() { printf("B3 = %p\n", this); } }; 12dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct B4 : virtual B1 { B4() { printf("B4 = %p\n", this); } virtual void g() { printf("B4"); } }; 13dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 14dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct A : B0, virtual B1 { 15dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt __declspec(align(16)) int a; 16dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt A() : a(0xf000000A) { printf(" A = %p\n\n", this); } 17dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt virtual void f() { printf("A"); } 18dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 19dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 20dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: *** Dumping AST Record Layout 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: *** Dumping AST Record Layout 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | struct A 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | (A vftable pointer) 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 16 | struct B0 (base) 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 16 | int a 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 20 | (A vbtable pointer) 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 48 | int a 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 64 | struct B1 (virtual base) 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 64 | int a 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: | [sizeof=80, align=16 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: | nvsize=64, nvalign=16] 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64: *** Dumping AST Record Layout 347967c95891c5f65f6312fbbcb999ac257d776914Warren Hunt// CHECK-X64: *** Dumping AST Record Layout 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64: *** Dumping AST Record Layout 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | struct A 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | (A vftable pointer) 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 16 | struct B0 (base) 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 16 | int a 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 24 | (A vbtable pointer) 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 48 | int a 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 64 | struct B1 (virtual base) 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 64 | int a 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: | [sizeof=80, align=16 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: | nvsize=64, nvalign=16] 46dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 47dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct B : B2, B0, virtual B1 { 48dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt __declspec(align(16)) int a; 49dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt B() : a(0xf000000B) { printf(" B = %p\n\n", this); } 50dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt virtual void f() { printf("B"); } 51dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 52dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 53dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: *** Dumping AST Record Layout 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | struct B 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | struct B2 (primary base) 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | (B2 vftable pointer) 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 4 | struct B0 (base) 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 4 | int a 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 8 | (B vbtable pointer) 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 32 | int a 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 48 | struct B1 (virtual base) 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 48 | int a 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: | [sizeof=64, align=16 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: | nvsize=48, nvalign=16] 667967c95891c5f65f6312fbbcb999ac257d776914Warren Hunt// CHECK-X64: *** Dumping AST Record Layout 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64: *** Dumping AST Record Layout 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | struct B 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | struct B2 (primary base) 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | (B2 vftable pointer) 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 8 | struct B0 (base) 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 8 | int a 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 16 | (B vbtable pointer) 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 32 | int a 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 48 | struct B1 (virtual base) 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 48 | int a 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: | [sizeof=64, align=16 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: | nvsize=48, nvalign=16] 79dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 80dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct C : B3, B0, virtual B1 { 81dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt __declspec(align(16)) int a; 82dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt C() : a(0xf000000C) { printf(" C = %p\n\n", this); } 83dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt virtual void f() { printf("C"); } 84dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 85dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 86dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: *** Dumping AST Record Layout 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | struct C 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | (C vftable pointer) 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 16 | struct B3 (base) 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 16 | (B3 vbtable pointer) 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 20 | struct B0 (base) 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 20 | int a 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 32 | int a 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 48 | struct B1 (virtual base) 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 48 | int a 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: | [sizeof=64, align=16 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: | nvsize=48, nvalign=16] 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64: *** Dumping AST Record Layout 1007967c95891c5f65f6312fbbcb999ac257d776914Warren Hunt// CHECK-X64: *** Dumping AST Record Layout 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | struct C 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | (C vftable pointer) 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 16 | struct B3 (base) 104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 16 | (B3 vbtable pointer) 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 24 | struct B0 (base) 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 24 | int a 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 32 | int a 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 48 | struct B1 (virtual base) 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 48 | int a 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: | [sizeof=64, align=16 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: | nvsize=48, nvalign=16] 112dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 113dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct D : B4, B0, virtual B1 { 114dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt __declspec(align(16)) int a; 115dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt D() : a(0xf000000D) { printf(" D = %p\n\n", this); } 116dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt virtual void f() { printf("D"); } 117dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 118dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 119dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: *** Dumping AST Record Layout 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | struct D 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | struct B4 (primary base) 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 0 | (B4 vftable pointer) 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 4 | (B4 vbtable pointer) 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 8 | struct B0 (base) 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 8 | int a 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 16 | int a 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 32 | struct B1 (virtual base) 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: 32 | int a 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: | [sizeof=48, align=16 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: | nvsize=32, nvalign=16] 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64: *** Dumping AST Record Layout 1337967c95891c5f65f6312fbbcb999ac257d776914Warren Hunt// CHECK-X64: *** Dumping AST Record Layout 134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | struct D 135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | struct B4 (primary base) 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 0 | (B4 vftable pointer) 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 8 | (B4 vbtable pointer) 138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 16 | struct B0 (base) 139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 16 | int a 140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 32 | int a 141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 48 | struct B1 (virtual base) 142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: 48 | int a 143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: | [sizeof=64, align=16 144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-X64-NEXT: | nvsize=48, nvalign=16] 145dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 146dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntint a[ 147dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(A)+ 148dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(B)+ 149dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(C)+ 150dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(D)]; 151