ms-x86-vfvb-sharing.cpp revision dc58180432868cfa9c060d5c41114634e4b841c7
13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \ 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// RUN: | FileCheck %s 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyryextern "C" int printf(const char *fmt, ...); 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } }; 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } }; 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct B2 { B2() { printf("B2 = %p\n", this); } virtual void g() { printf("B2"); } }; 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct B3 : virtual B1 { B3() { printf("B3 = %p\n", this); } }; 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct B4 : virtual B1 { B4() { printf("B4 = %p\n", this); } virtual void g() { printf("B4"); } }; 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct A : B0, virtual B1 { 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry __declspec(align(16)) int a; 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry A() : a(0xf000000A) { printf(" A = %p\n\n", this); } 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void f() { printf("A"); } 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: *** Dumping AST Record Layout 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | struct A 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | (A vftable pointer) 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 16 | struct B0 (base) 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 16 | int a 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 20 | (A vbtable pointer) 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 48 | int a 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 64 | struct B1 (virtual base) 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 64 | int a 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: | [sizeof=80, align=16 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: | nvsize=64, nvalign=16] 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct B : B2, B0, virtual B1 { 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry __declspec(align(16)) int a; 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry B() : a(0xf000000B) { printf(" B = %p\n\n", this); } 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void f() { printf("B"); } 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: *** Dumping AST Record Layout 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | struct B 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | struct B2 (primary base) 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | (B2 vftable pointer) 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 4 | struct B0 (base) 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 4 | int a 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 8 | (B vbtable pointer) 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 32 | int a 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 48 | struct B1 (virtual base) 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 48 | int a 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: | [sizeof=64, align=16 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: | nvsize=48, nvalign=16] 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct C : B3, B0, virtual B1 { 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry __declspec(align(16)) int a; 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry C() : a(0xf000000C) { printf(" C = %p\n\n", this); } 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void f() { printf("C"); } 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: *** Dumping AST Record Layout 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | struct C 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | (C vftable pointer) 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 16 | struct B3 (base) 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 16 | (B3 vbtable pointer) 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 20 | struct B0 (base) 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 20 | int a 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 32 | int a 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 48 | struct B1 (virtual base) 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 48 | int a 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: | [sizeof=64, align=16 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: | nvsize=48, nvalign=16] 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct D : B4, B0, virtual B1 { 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry __declspec(align(16)) int a; 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry D() : a(0xf000000D) { printf(" D = %p\n\n", this); } 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void f() { printf("D"); } 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: *** Dumping AST Record Layout 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | struct D 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | struct B4 (primary base) 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 0 | (B4 vftable pointer) 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 4 | (B4 vbtable pointer) 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 8 | struct B0 (base) 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 8 | int a 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 16 | int a 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 32 | struct B1 (virtual base) 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: 32 | int a 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: | [sizeof=48, align=16 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CHECK: | nvsize=32, nvalign=16] 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryint a[ 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyrysizeof(A)+ 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrysizeof(B)+ 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyrysizeof(C)+ 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyrysizeof(D)]; 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry