blob: a90e7228d3ecfc224af7c0b4911d79faf436048f [file] [log] [blame]
Mike Stump06758d02009-08-04 20:37:29 +00001// RUN: clang-cc -triple x86_64-apple-darwin -frtti=0 -std=c++0x -S %s -o %t-64.s &&
2// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s &&
3// RUN: clang-cc -triple i386-apple-darwin -frtti=0 -std=c++0x -S %s -o %t-32.s &&
4// RUN: FileCheck -check-prefix LP32 -input-file=%t-32.s %s &&
5// RUN: true
Mike Stump3dee6ef2009-07-30 00:22:38 +00006
Mike Stump104ffaa2009-08-04 21:58:42 +00007struct B {
8 virtual void bar1();
9 virtual void bar2();
Mike Stump2effeca2009-08-06 00:38:46 +000010 int b;
Mike Stump104ffaa2009-08-04 21:58:42 +000011};
Mike Stump6f376332009-08-05 22:37:18 +000012void B::bar1() { }
13void B::bar2() { }
14
15struct C {
16 virtual void bee1();
17 virtual void bee2();
18};
19void C::bee1() { }
20void C::bee2() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000021
Mike Stump2effeca2009-08-06 00:38:46 +000022struct D {
23 virtual void boo();
24};
25void D::boo() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000026
Mike Stump2effeca2009-08-06 00:38:46 +000027struct E {
28 int e;
29};
30
31static_assert (sizeof (C) == (sizeof(void *)), "vtable pointer layout");
32
Mike Stumpeb19fa92009-08-06 13:41:24 +000033class A : public E, public B, public C {
Mike Stump3dee6ef2009-07-30 00:22:38 +000034public:
Mike Stump06758d02009-08-04 20:37:29 +000035 virtual void foo1();
36 virtual void foo2();
37 A() { }
Mike Stump2effeca2009-08-06 00:38:46 +000038 int a;
39} *ap;
Mike Stump6f376332009-08-05 22:37:18 +000040void A::foo1() { }
41void A::foo2() { }
Mike Stump3dee6ef2009-07-30 00:22:38 +000042
Mike Stump06758d02009-08-04 20:37:29 +000043int main() {
44 A a;
Mike Stump26899b02009-08-05 22:48:36 +000045 B b;
Mike Stump2effeca2009-08-06 00:38:46 +000046 ap->e = 1;
47 ap->b = 2;
Mike Stump06758d02009-08-04 20:37:29 +000048}
49
Mike Stump2effeca2009-08-06 00:38:46 +000050// CHECK-LP32: main:
51// CHECK-LP32: movl $1, 8(%eax)
52// CHECK-LP32: movl $2, 4(%eax)
53
54// CHECK-LP64: main:
55// CHECK-LP64: movl $1, 12(%rax)
56// CHECK-LP64: movl $2, 8(%rax)
57
Mike Stump26899b02009-08-05 22:48:36 +000058// CHECK-LP64: __ZTV1B:
59// CHECK-LP64: .space 8
60// CHECK-LP64: .space 8
61// CHECK-LP64: .quad __ZN1B4bar1Ev
62// CHECK-LP64: .quad __ZN1B4bar2Ev
63
64// CHECK-LP32: __ZTV1B:
65// CHECK-LP32: .space 4
66// CHECK-LP32: .space 4
67// CHECK-LP32: .long __ZN1B4bar1Ev
68// CHECK-LP32: .long __ZN1B4bar2Ev
69
Mike Stump06758d02009-08-04 20:37:29 +000070// CHECK-LP64: __ZTV1A:
71// CHECK-LP64: .space 8
72// CHECK-LP64: .space 8
Mike Stump104ffaa2009-08-04 21:58:42 +000073// CHECK-LP64: .quad __ZN1B4bar1Ev
74// CHECK-LP64: .quad __ZN1B4bar2Ev
Mike Stump06758d02009-08-04 20:37:29 +000075// CHECK-LP64: .quad __ZN1A4foo1Ev
76// CHECK-LP64: .quad __ZN1A4foo2Ev
Mike Stump2effeca2009-08-06 00:38:46 +000077// CHECK-LP64: .quad 18446744073709551600
Mike Stump6f376332009-08-05 22:37:18 +000078// CHECK-LP64: .space 8
79// CHECK-LP64: .quad __ZN1C4bee1Ev
80// CHECK-LP64: .quad __ZN1C4bee2Ev
Mike Stump06758d02009-08-04 20:37:29 +000081
82// CHECK-LP32: __ZTV1A:
83// CHECK-LP32: .space 4
84// CHECK-LP32: .space 4
Mike Stump104ffaa2009-08-04 21:58:42 +000085// CHECK-LP32: .long __ZN1B4bar1Ev
86// CHECK-LP32: .long __ZN1B4bar2Ev
Mike Stump06758d02009-08-04 20:37:29 +000087// CHECK-LP32: .long __ZN1A4foo1Ev
88// CHECK-LP32: .long __ZN1A4foo2Ev
Mike Stump2effeca2009-08-06 00:38:46 +000089// CHECK-LP32: .long 4294967284
Mike Stump6f376332009-08-05 22:37:18 +000090// CHECK-LP32: .space 4
91// CHECK-LP32: .long __ZN1C4bee1Ev
92// CHECK-LP32: .long __ZN1C4bee2Ev
Mike Stumpeb19fa92009-08-06 13:41:24 +000093
94struct D1 {
95 virtual void bar();
96 void *d1;
97};
98void D1::bar() { }
99
100class F : virtual public D1, virtual public D {
101public:
102 virtual void foo();
103 void *f;
104};
105void F::foo() { }
106
107void test2() {
108 F f;
109 f.f = 0;
110}
111
112static_assert(sizeof(F) == sizeof(void*)*4, "invalid vbase size");