| // RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -O0 -S %s -o %t-64.s && | 
 | // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s && | 
 | // RUN: clang-cc -triple i386-apple-darwin -std=c++0x -O0 -S %s -o %t-32.s && | 
 | // RUN: FileCheck -check-prefix LP32 -input-file=%t-32.s %s && | 
 |  | 
 | // RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -O3 -S %s -o %t-O3-64.s && | 
 | // RUN: FileCheck -check-prefix LPOPT64 --input-file=%t-O3-64.s %s && | 
 | // RUN: clang-cc -triple i386-apple-darwin -std=c++0x -O3 -S %s -o %t-O3-32.s && | 
 | // RUN: FileCheck -check-prefix LPOPT32 -input-file=%t-O3-32.s %s && | 
 |  | 
 | // RUN: true | 
 |  | 
 | struct B { | 
 |   virtual void bar1(); | 
 |   virtual void bar2(); | 
 |   int b; | 
 | }; | 
 | void B::bar1() { } | 
 | void B::bar2() { } | 
 |  | 
 | struct C { | 
 |   virtual void bee1(); | 
 |   virtual void bee2(); | 
 | }; | 
 | void C::bee1() { } | 
 | void C::bee2() { } | 
 |  | 
 | struct D { | 
 |   virtual void boo(); | 
 | }; | 
 | void D::boo() { } | 
 |  | 
 | struct D1 { | 
 |   virtual void bar(); | 
 |   virtual void bar2(); | 
 |   virtual void bar3(); | 
 |   virtual void bar4(); | 
 |   virtual void bar5(); | 
 |   void *d1; | 
 | }; | 
 | void D1::bar() { } | 
 |  | 
 | class F : virtual public D1, virtual public D { | 
 | public: | 
 |   virtual void foo(); | 
 |   void *f; | 
 | }; | 
 | void F::foo() { } | 
 |  | 
 | int j; | 
 | void test2() { | 
 |   F f; | 
 |   static int sz = (char *)(&f.f) - (char *)(&f); | 
 |   j = sz; | 
 |   // FIXME: These should result in a frontend constant a la fold, no run time | 
 |   // initializer | 
 |   // CHECK-LPOPT32: movl $4, __ZZ5test2vE2sz | 
 |   // CHECK-LPOPT64: movl $8, __ZZ5test2vE2sz(%rip) | 
 | } | 
 |  | 
 | static_assert(sizeof(F) == sizeof(void*)*4, "invalid vbase size"); | 
 |  | 
 | struct E { | 
 |   int e; | 
 | }; | 
 |  | 
 | static_assert (sizeof (C) == (sizeof(void *)), "vtable pointer layout"); | 
 |  | 
 | class A : public E, public B, public C { | 
 | public: | 
 |   virtual void foo1(); | 
 |   virtual void foo2(); | 
 |   A() { } | 
 |   int a; | 
 | } *ap; | 
 | void A::foo1() { } | 
 | void A::foo2() { } | 
 |  | 
 | int main() { | 
 |   A a; | 
 |   B b; | 
 |   ap->e = 1; | 
 |   ap->b = 2; | 
 | } | 
 |  | 
 | // CHECK-LP32: main: | 
 | // CHECK-LP32: movl $1, 8(%eax) | 
 | // CHECK-LP32: movl $2, 4(%eax) | 
 |  | 
 | // CHECK-LP64: main: | 
 | // CHECK-LP64: movl $1, 12(%rax) | 
 | // CHECK-LP64: movl $2, 8(%rax) | 
 |  | 
 |  | 
 | struct test6_B2 { virtual void funcB2(); char b[1000]; }; | 
 | struct test6_B1 : virtual test6_B2 { virtual void funcB1(); }; | 
 |  | 
 | struct test6_D : test6_B2, virtual test6_B1 { | 
 | }; | 
 |  | 
 | // CHECK-LP32: .zerofill __DATA, __common, _d6, 2012, 4 | 
 | // CHECK-LP64: .zerofill __DATA, __common, _d6, 2024, 4 | 
 |  | 
 | struct test7_B2 { virtual void funcB2(); }; | 
 | struct test7_B1 : virtual test7_B2 { virtual void funcB1(); }; | 
 |  | 
 | struct test7_D : test7_B2, virtual test7_B1 { | 
 | }; | 
 |  | 
 | // CHECK-LP32: .zerofill __DATA, __common, _d7, 8, 3 | 
 | // CHECK-LP64: .zerofill __DATA, __common, _d7, 16, 3 | 
 |  | 
 |  | 
 | struct test3_B3 { virtual void funcB3(); }; | 
 | struct test3_B2 : virtual test3_B3 { virtual void funcB2(); }; | 
 | struct test3_B1 : virtual test3_B2 { virtual void funcB1(); }; | 
 |  | 
 | struct test3_D  : virtual test3_B1 { | 
 |   virtual void funcD() { } | 
 | }; | 
 |  | 
 | // CHECK-LP32:__ZTV7test3_D: | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test3_D | 
 | // CHECK-LP32-NEXT: .long __ZN8test3_B36funcB3Ev | 
 | // CHECK-LP32-NEXT: .long __ZN8test3_B26funcB2Ev | 
 | // CHECK-LP32-NEXT: .long __ZN8test3_B16funcB1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN7test3_D5funcDEv | 
 |  | 
 | // CHECK-LP64:__ZTV7test3_D: | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test3_D | 
 | // CHECK-LP64-NEXT: .quad __ZN8test3_B36funcB3Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN8test3_B26funcB2Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN8test3_B16funcB1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN7test3_D5funcDEv | 
 |  | 
 | struct test4_D : virtual B, virtual C { | 
 | }; | 
 |  | 
 | // CHECK-LP32:__ZTV7test4_D: | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test4_D | 
 | // CHECK-LP32-NEXT: .long __ZN1C4bee1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN1C4bee2Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967292 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test4_D  | 
 | // CHECK-LP32-NEXT: .long __ZN1B4bar1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN1B4bar2Ev | 
 |  | 
 | // CHECK-LP64:__ZTV7test4_D: | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test4_D | 
 | // CHECK-LP64-NEXT: .quad __ZN1C4bee1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN1C4bee2Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551608 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test4_D | 
 | // CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev | 
 |  | 
 |  | 
 | struct test5_B3 { virtual void funcB3(); }; | 
 | struct test5_B2 : virtual test5_B3 { virtual void funcB2(); }; | 
 | struct test5_B1 : virtual test5_B2 { virtual void funcB1(); }; | 
 |  | 
 | struct test5_B23 { virtual void funcB23(); }; | 
 | struct test5_B22 : virtual test5_B23 { virtual void funcB22(); }; | 
 | struct test5_B21 : virtual test5_B22 { virtual void funcB21(); }; | 
 |  | 
 |  | 
 | struct B232 { virtual void funcB232(); }; | 
 | struct B231 { virtual void funcB231(); }; | 
 |  | 
 | struct test5_B33 { virtual void funcB33(); }; | 
 | struct test5_B32 : virtual test5_B33, virtual B232 { virtual void funcB32(); }; | 
 | struct test5_B31 : virtual test5_B32, virtual B231 { virtual void funcB31(); }; | 
 |  | 
 | struct test5_D  : virtual test5_B1, virtual test5_B21, virtual test5_B31 { | 
 |   virtual void funcD() { } | 
 | }; | 
 |  | 
 | // CHECK-LP32:__ZTV7test5_D: | 
 | // CHECK-LP32-NEXT: .long 16 | 
 | // CHECK-LP32-NEXT: .long 12 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 4 | 
 | // CHECK-LP32-NEXT: .long 4 | 
 | // CHECK-LP32-NEXT: .long 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test5_D | 
 | // CHECK-LP32-NEXT: .long __ZN8test5_B36funcB3Ev | 
 | // CHECK-LP32-NEXT: .long __ZN8test5_B26funcB2Ev | 
 | // CHECK-LP32-NEXT: .long __ZN8test5_B16funcB1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN7test5_D5funcDEv | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT .space 4					FIXME | 
 | // CHECK-LP32: .long 4294967292 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test5_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test5_B237funcB23Ev | 
 | // CHECK-LP32-NEXT: .long __ZN9test5_B227funcB22Ev | 
 | // CHECK-LP32-NEXT: .long __ZN9test5_B217funcB21Ev | 
 | // CHECK-LP32 .space 4 | 
 | // CHECK-LP32 .long 8						FIXME | 
 | // CHECK-LP32: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32: .long 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967288 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test5_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test5_B337funcB33Ev | 
 | // CHECK-LP32-NEXT: .long __ZN9test5_B327funcB32Ev | 
 | // CHECK-LP32-NEXT: .long __ZN9test5_B317funcB31Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967284 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test5_D | 
 | // CHECK-LP32-NEXT: .long __ZN4B2328funcB232Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967280 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test5_D | 
 | // CHECK-LP32-NEXT: .long __ZN4B2318funcB231Ev | 
 |  | 
 | // CHECK-LP64:__ZTV7test5_D: | 
 | // CHECK-LP64-NEXT: .quad 32 | 
 | // CHECK-LP64-NEXT: .quad 24 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 8 | 
 | // CHECK-LP64-NEXT: .quad 8 | 
 | // CHECK-LP64-NEXT: .quad 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test5_D | 
 | // CHECK-LP64-NEXT: .quad __ZN8test5_B36funcB3Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN8test5_B26funcB2Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN8test5_B16funcB1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN7test5_D5funcDEv | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT .space 8 					FIXME | 
 | // CHECK-LP64: .quad 18446744073709551608 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test5_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test5_B237funcB23Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN9test5_B227funcB22Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN9test5_B217funcB21Ev | 
 | // CHECK-LP64 .space 8 | 
 | // CHECK-LP64 .quad 16						FIXME | 
 | // CHECK-LP64: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64: .quad 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551600 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test5_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test5_B337funcB33Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN9test5_B327funcB32Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN9test5_B317funcB31Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551592 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test5_D | 
 | // CHECK-LP64-NEXT: .quad __ZN4B2328funcB232Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551584 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test5_D | 
 | // CHECK-LP64-NEXT: .quad __ZN4B2318funcB231Ev | 
 |  | 
 | struct test8_B1 { | 
 |   virtual void ftest8_B1() { } | 
 | }; | 
 | struct test8_B2aa { | 
 |   virtual void ftest8_B2aa() { } | 
 |   int i; | 
 | }; | 
 | struct test8_B2ab { | 
 |   virtual void ftest8_B2ab() { } | 
 |   int i; | 
 | }; | 
 | struct test8_B2a : virtual test8_B2aa, virtual test8_B2ab { | 
 |   virtual void ftest8_B2a() { } | 
 | }; | 
 | struct test8_B2b { | 
 |   virtual void ftest8_B2b() { } | 
 | }; | 
 | struct test8_B2 : test8_B2a, test8_B2b { | 
 |   virtual void ftest8_B2() { } | 
 | }; | 
 | struct test8_B3 { | 
 |   virtual void ftest8_B3() { } | 
 | }; | 
 | class test8_D : test8_B1, test8_B2, test8_B3 { | 
 | }; | 
 |  | 
 | // CHECK-LP32:__ZTV7test8_D: | 
 | // CHECK-LP32-NEXT: .long 24 | 
 | // CHECK-LP32-NEXT: .long 16 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test8_D | 
 | // CHECK-LP32-NEXT: .long __ZN8test8_B19ftest8_B1Ev | 
 | // CHECK-LP32-NEXT: .long 20 | 
 | // CHECK-LP32-NEXT: .long 12 | 
 | // CHECK-LP32-NEXT: .long 4294967292 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test8_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test8_B2a10ftest8_B2aEv | 
 | // CHECK-LP32-NEXT: .long __ZN8test8_B29ftest8_B2Ev | 
 | // CHECK-LP32-NEXT: .long 4294967288 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test8_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test8_B2b10ftest8_B2bEv | 
 | // CHECK-LP32-NEXT: .long 4294967284 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test8_D | 
 | // CHECK-LP32-NEXT: .long __ZN8test8_B39ftest8_B3Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967280 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test8_D | 
 | // CHECK-LP32-NEXT: .long __ZN10test8_B2aa11ftest8_B2aaEv | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967272 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test8_D | 
 | // CHECK-LP32-NEXT: .long __ZN10test8_B2ab11ftest8_B2abEv | 
 |  | 
 | // CHECK-LP64:__ZTV7test8_D: | 
 | // CHECK-LP64-NEXT: .quad 48 | 
 | // CHECK-LP64-NEXT: .quad 32 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test8_D | 
 | // CHECK-LP64-NEXT: .quad __ZN8test8_B19ftest8_B1Ev | 
 | // CHECK-LP64-NEXT: .quad 40 | 
 | // CHECK-LP64-NEXT: .quad 24 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551608 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test8_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test8_B2a10ftest8_B2aEv | 
 | // CHECK-LP64-NEXT: .quad __ZN8test8_B29ftest8_B2Ev | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551600 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test8_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test8_B2b10ftest8_B2bEv | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551592 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test8_D | 
 | // CHECK-LP64-NEXT: .quad __ZN8test8_B39ftest8_B3Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551584 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test8_D | 
 | // CHECK-LP64-NEXT: .quad __ZN10test8_B2aa11ftest8_B2aaEv | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551568 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test8_D | 
 | // CHECK-LP64-NEXT: .quad __ZN10test8_B2ab11ftest8_B2abEv | 
 |  | 
 |  | 
 | struct test9_B3 { virtual void funcB3(); int i; }; | 
 | struct test9_B2 : virtual test9_B3 { virtual void funcB2(); int i; }; | 
 | struct test9_B1 : virtual test9_B2 { virtual void funcB1(); int i; }; | 
 |  | 
 | struct test9_B23 { virtual void funcB23(); int i; }; | 
 | struct test9_B22 : virtual test9_B23 { virtual void funcB22(); int i; }; | 
 | struct test9_B21 : virtual test9_B22 { virtual void funcB21(); int i; }; | 
 |  | 
 |  | 
 | struct test9_B232 { virtual void funcB232(); int i; }; | 
 | struct test9_B231 { virtual void funcB231(); int i; }; | 
 |  | 
 | struct test9_B33 { virtual void funcB33(); int i; }; | 
 | struct test9_B32 : virtual test9_B33, virtual test9_B232 { virtual void funcB32(); int i; }; | 
 | struct test9_B31 : virtual test9_B32, virtual test9_B231 { virtual void funcB31(); int i; }; | 
 |  | 
 | struct test9_D  : virtual test9_B1, virtual test9_B21, virtual test9_B31 { | 
 |   virtual void funcD() { } | 
 | }; | 
 |  | 
 | // CHECK-LP64: __ZTV7test9_D: | 
 | // CHECK-LP64-NEXT: .quad 168 | 
 | // CHECK-LP64-NEXT: .quad 152 | 
 | // CHECK-LP64-NEXT: .quad 136 | 
 | // CHECK-LP64-NEXT: .quad 120 | 
 | // CHECK-LP64-NEXT: .quad 104 | 
 | // CHECK-LP64-NEXT: .quad 88 | 
 | // CHECK-LP64-NEXT: .quad 72 | 
 | // CHECK-LP64-NEXT: .quad 56 | 
 | // CHECK-LP64-NEXT: .quad 40 | 
 | // CHECK-LP64-NEXT: .quad 24 | 
 | // CHECK-LP64-NEXT: .quad 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN7test9_D5funcDEv | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 32 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551608 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN8test9_B16funcB1Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551592 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN8test9_B26funcB2Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551576 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN8test9_B36funcB3Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 32 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551560 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test9_B217funcB21Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551544 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test9_B227funcB22Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551528 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test9_B237funcB23Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 64 | 
 | // CHECK-LP64-NEXT: .quad 48 | 
 | // CHECK-LP64-NEXT: .quad 32 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551512 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test9_B317funcB31Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 32 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551496 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test9_B327funcB32Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551480 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test9_B337funcB33Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551464 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN10test9_B2328funcB232Ev | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551448 | 
 | // CHECK-LP64-NEXT: .quad __ZTI7test9_D | 
 | // CHECK-LP64-NEXT: .quad __ZN10test9_B2318funcB231Ev | 
 |  | 
 | // CHECK-LP32: __ZTV7test9_D: | 
 | // CHECK-LP32-NEXT: .long 84 | 
 | // CHECK-LP32-NEXT: .long 76 | 
 | // CHECK-LP32-NEXT: .long 68 | 
 | // CHECK-LP32-NEXT: .long 60 | 
 | // CHECK-LP32-NEXT: .long 52 | 
 | // CHECK-LP32-NEXT: .long 44 | 
 | // CHECK-LP32-NEXT: .long 36 | 
 | // CHECK-LP32-NEXT: .long 28 | 
 | // CHECK-LP32-NEXT: .long 20 | 
 | // CHECK-LP32-NEXT: .long 12 | 
 | // CHECK-LP32-NEXT: .long 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN7test9_D5funcDEv | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 16 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 4294967292 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN8test9_B16funcB1Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 4294967284 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN8test9_B26funcB2Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967276 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN8test9_B36funcB3Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 16 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 4294967268 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test9_B217funcB21Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 4294967260 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test9_B227funcB22Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967252 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test9_B237funcB23Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 32 | 
 | // CHECK-LP32-NEXT: .long 24 | 
 | // CHECK-LP32-NEXT: .long 16 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 4294967244 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test9_B317funcB31Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 16 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 4294967236 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test9_B327funcB32Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967228 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test9_B337funcB33Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967220 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN10test9_B2328funcB232Ev | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967212 | 
 | // CHECK-LP32-NEXT: .long __ZTI7test9_D | 
 | // CHECK-LP32-NEXT: .long __ZN10test9_B2318funcB231Ev | 
 |  | 
 | struct test10_O { int i; }; | 
 |  | 
 | struct test10_B1 : virtual test10_O { | 
 |   virtual void ftest10_B1() { } | 
 | }; | 
 |  | 
 | struct test10_B2aa : virtual test10_O { | 
 |   int i; | 
 | }; | 
 | struct test10_B2ab : virtual test10_O { | 
 |   int i; | 
 | }; | 
 | struct test10_B2a : virtual test10_B2aa, virtual test10_B2ab,virtual test10_O { | 
 |   virtual void ftest10_B2a() { } | 
 | }; | 
 | struct test10_B2b : virtual test10_O { | 
 |   virtual void ftest10_B2b() { } | 
 | }; | 
 | struct test10_B2 : test10_B2a { | 
 |   virtual void ftest10_B2() { } | 
 | }; | 
 | class test10_D : test10_B1, test10_B2 { | 
 |    | 
 |   void ftest10_B2aa() { } | 
 | }; | 
 |  | 
 | // CHECK-LP64:__ZTV8test10_D: | 
 | // CHECK-LP64-NEXT: .quad 40 | 
 | // CHECK-LP64-NEXT: .quad 24 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI8test10_D | 
 | // CHECK-LP64-NEXT: .quad __ZN9test10_B110ftest10_B1Ev | 
 | // CHECK-LP64-NEXT: .quad 32 | 
 | // CHECK-LP64-NEXT: .quad 8 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551608 | 
 | // CHECK-LP64-NEXT: .quad __ZTI8test10_D | 
 | // CHECK-LP64-NEXT: .quad __ZN10test10_B2a11ftest10_B2aEv | 
 | // CHECK-LP64-NEXT: .quad __ZN9test10_B210ftest10_B2Ev | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551608 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551592 | 
 | // CHECK-LP64-NEXT: .quad __ZTI8test10_D | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551592 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551576 | 
 | // CHECK-LP64-NEXT: .quad __ZTI8test10_D | 
 |  | 
 | // CHECK-LP32: __ZTV8test10_D: | 
 | // CHECK-LP32-NEXT: .long 20 | 
 | // CHECK-LP32-NEXT: .long 12 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI8test10_D | 
 | // CHECK-LP32-NEXT: .long __ZN9test10_B110ftest10_B1Ev | 
 | // CHECK-LP32-NEXT: .long 16 | 
 | // CHECK-LP32-NEXT: .long 4 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .long 4294967292 | 
 | // CHECK-LP32-NEXT: .long __ZTI8test10_D | 
 | // CHECK-LP32-NEXT: .long __ZN10test10_B2a11ftest10_B2aEv | 
 | // CHECK-LP32-NEXT: .long __ZN9test10_B210ftest10_B2Ev | 
 | // CHECK-LP32-NEXT: .long 4294967292 | 
 | // CHECK-LP32-NEXT: .long 4294967284 | 
 | // CHECK-LP32-NEXT: .long __ZTI8test10_D | 
 | // CHECK-LP32-NEXT: .long 4294967284 | 
 | // CHECK-LP32-NEXT: .long 4294967276 | 
 | // CHECK-LP32-NEXT: .long __ZTI8test10_D | 
 |  | 
 | struct test11_B { | 
 |   virtual void B1() { } | 
 |   virtual void D() { } | 
 |   virtual void B2() { } | 
 | }; | 
 |  | 
 | struct test11_D : test11_B { | 
 |   virtual void D1() { } | 
 |   virtual void D() { } | 
 |   virtual void D2() { } | 
 | }; | 
 |  | 
 | // CHECK-LP32:__ZTV8test11_D: | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI8test11_D | 
 | // CHECK-LP32-NEXT: .long __ZN8test11_B2B1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN8test11_D1DEv | 
 | // CHECK-LP32-NEXT: .long __ZN8test11_B2B2Ev | 
 | // CHECK-LP32-NEXT: .long __ZN8test11_D2D1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN8test11_D2D2Ev | 
 |  | 
 |  | 
 | // CHECK-LP64:__ZTV8test11_D: | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI8test11_D | 
 | // CHECK-LP64-NEXT: .quad __ZN8test11_B2B1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN8test11_D1DEv | 
 | // CHECK-LP64-NEXT: .quad __ZN8test11_B2B2Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN8test11_D2D1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN8test11_D2D2Ev | 
 |  | 
 |  | 
 |  | 
 | // CHECK-LP64: __ZTV1B: | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI1B | 
 | // CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev | 
 |  | 
 | // CHECK-LP32: __ZTV1B: | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI1B | 
 | // CHECK-LP32-NEXT: .long __ZN1B4bar1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN1B4bar2Ev | 
 |  | 
 | // CHECK-LP64: __ZTV1A: | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI1A | 
 | // CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN1A4foo1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN1A4foo2Ev | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551600 | 
 | // CHECK-LP64-NEXT: .quad __ZTI1A | 
 | // CHECK-LP64-NEXT: .quad __ZN1C4bee1Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN1C4bee2Ev | 
 |  | 
 | // CHECK-LP32: __ZTV1A: | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI1A | 
 | // CHECK-LP32-NEXT: .long __ZN1B4bar1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN1B4bar2Ev | 
 | // CHECK-LP32-NEXT: .long __ZN1A4foo1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN1A4foo2Ev | 
 | // CHECK-LP32-NEXT: .long 4294967284 | 
 | // CHECK-LP32-NEXT: .long __ZTI1A | 
 | // CHECK-LP32-NEXT: .long __ZN1C4bee1Ev | 
 | // CHECK-LP32-NEXT: .long __ZN1C4bee2Ev | 
 |  | 
 | // CHECK-LP32:__ZTV1F: | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 8 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long __ZTI1F | 
 | // CHECK-LP32-NEXT: .long __ZN1D3booEv | 
 | // CHECK-LP32-NEXT: .long __ZN1F3fooEv | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .space 4 | 
 | // CHECK-LP32-NEXT: .long 4294967288 | 
 | // CHECK-LP32-NEXT: .long __ZTI1F | 
 | // CHECK-LP32-NEXT: .long __ZN2D13barEv | 
 | // CHECK-LP32-NEXT: .long __ZN2D14bar2Ev | 
 | // CHECK-LP32-NEXT: .long __ZN2D14bar3Ev | 
 | // CHECK-LP32-NEXT: .long __ZN2D14bar4Ev | 
 | // CHECK-LP32-NEXT: .long __ZN2D14bar5Ev | 
 |  | 
 | // CHECK-LP64: __ZTV1F: | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 16 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad __ZTI1F | 
 | // CHECK-LP64-NEXT: .quad __ZN1D3booEv | 
 | // CHECK-LP64-NEXT: .quad __ZN1F3fooEv | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .space 8 | 
 | // CHECK-LP64-NEXT: .quad 18446744073709551600 | 
 | // CHECK-LP64-NEXT: .quad __ZTI1F | 
 | // CHECK-LP64-NEXT: .quad __ZN2D13barEv | 
 | // CHECK-LP64-NEXT: .quad __ZN2D14bar2Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN2D14bar3Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN2D14bar4Ev | 
 | // CHECK-LP64-NEXT: .quad __ZN2D14bar5Ev | 
 |  | 
 |  | 
 | test11_D d11; | 
 | test10_D d10; | 
 | test9_D d9; | 
 | test8_D d8; | 
 |  | 
 | test5_D d5; | 
 | test4_D d4; | 
 | test3_D d3; | 
 |  | 
 | test6_D d6; | 
 | test7_D d7; |