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