1a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fapple-kext -fno-rtti -emit-llvm -o - %s | FileCheck %s
2a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
3a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK: @_ZTV1A = unnamed_addr constant [4 x i8*] [i8* null, i8* null, i8* bitcast (i8* (%struct.A*)* @_ZNK1A3abcEv to i8*), i8* null]
4a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK: @_ZTV4Base = unnamed_addr constant [4 x i8*] [i8* null, i8* null, i8* bitcast (i8* (%struct.A*)* @_ZNK4Base3abcEv to i8*), i8* null]
5a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK: @_ZTV8Derived2 = unnamed_addr constant [5 x i8*] [i8* null, i8* null, i8* null, i8* bitcast (i8* (%struct.A*)* @_ZNK8Derived23efgEv to i8*), i8* null]
6a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK: @_ZTV2D2 = unnamed_addr constant [5 x i8*] [i8* null, i8* null, i8* null, i8* bitcast (i8* (%struct.A*)* @_ZNK2D23abcEv to i8*), i8* null]
7a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
8a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct A {
9a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  virtual const char* abc(void) const;
10a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian};
11a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
12a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianconst char* A::abc(void) const {return "A"; };
13a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
14a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct B : virtual A {
15a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  virtual void VF();
16a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian};
17a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
18a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianvoid B::VF() {}
19a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
20a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianvoid FUNC(B* p) {
21a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK: [[T1:%.*]] = load i8* (%struct.A*)** getelementptr inbounds (i8* (%struct.A*)** bitcast ([4 x i8*]* @_ZTV1A to i8* (%struct.A*)**), i64 2)
22a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK-NEXT:  [[T2:%.*]] = call i8* [[T1]]
23a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  const char* c = p->A::abc();
24a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian}
25a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
26a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
27a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// Test2
28a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct Base { virtual char* abc(void) const; };
29a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
30a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianchar* Base::abc() const { return 0; }
31a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
32a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct Derived : public Base {
33a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian};
34a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
35a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianvoid FUNC1(Derived* p) {
36a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK: [[U1:%.*]] = load i8* (%struct.A*)** getelementptr inbounds (i8* (%struct.A*)** bitcast ([4 x i8*]* @_ZTV4Base to i8* (%struct.A*)**), i64 2)
37a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK-NEXT:  [[U2:%.*]] = call i8* [[U1]]
38a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  char* c = p->Base::abc();
39a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian}
40a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
41a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
42a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// Test3
43a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct Base2 { };
44a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
45a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct Derived2 : virtual Base2 {
46a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  virtual char* efg(void) const;
47a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian};
48a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
49a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianchar* Derived2::efg(void) const { return 0; }
50a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
51a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianvoid FUNC2(Derived2* p) {
52a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK: [[V1:%.*]] = load i8* (%struct.A*)** getelementptr inbounds (i8* (%struct.A*)** bitcast ([5 x i8*]* @_ZTV8Derived2 to i8* (%struct.A*)**), i64 3)
53a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK-NEXT:  [[V2:%.*]] = call i8* [[V1]]
54a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  char* c = p->Derived2::efg();
55a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian}
56a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
57a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// Test4
58a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct Base3 { };
59a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
60a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct D1 : virtual Base3 {
61a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian};
62a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
63a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct D2 : virtual Base3 {
64a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian virtual char *abc(void) const;
65a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian};
66a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
67a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianstruct Sub : D1, D2 {
68a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian};
69a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
70a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianchar* D2::abc(void) const { return 0; }
71a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
72a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanianvoid FUNC3(Sub* p) {
73a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK: [[W1:%.*]] = load i8* (%struct.A*)** getelementptr inbounds (i8* (%struct.A*)** bitcast ([5 x i8*]* @_ZTV2D2 to i8* (%struct.A*)**), i64 3)
74a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian// CHECK-NEXT:  [[W2:%.*]] = call i8* [[W1]]
75a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  char* c = p->D2::abc();
76a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian}
77a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian
78