1// RUN: %clang_cc1 %s -triple armv7-none-eabi -emit-llvm -o - | FileCheck %s 2 3struct A { 4 virtual void f(); 5 virtual void f_const() const; 6 7 A h(); 8}; 9 10A g(); 11 12void f(A a, A *ap, A& ar) { 13 // This should not be a virtual function call. 14 15 // CHECK: call void @_ZN1A1fEv(%struct.A* %a) 16 a.f(); 17 18 // CHECK: call void % 19 ap->f(); 20 21 // CHECK: call void % 22 ar.f(); 23 24 // CHECK: call void @_ZN1A1fEv 25 A().f(); 26 27 // CHECK: call void @_ZN1A1fEv 28 g().f(); 29 30 // CHECK: call void @_ZN1A1fEv 31 a.h().f(); 32 33 // CHECK: call void @_ZNK1A7f_constEv 34 a.f_const(); 35 36 // CHECK: call void @_ZN1A1fEv 37 (a).f(); 38} 39 40struct B { 41 virtual void f(); 42 ~B(); 43 44 B h(); 45}; 46 47 48void f() { 49 // CHECK: call void @_ZN1B1fEv 50 B().f(); 51 52 // CHECK: call void @_ZN1B1fEv 53 B().h().f(); 54} 55 56namespace test2 { 57 struct foo { 58 virtual void f(); 59 virtual ~foo(); 60 }; 61 62 struct bar : public foo { 63 virtual void f(); 64 virtual ~bar(); 65 }; 66 67 void f(bar *b) { 68 // CHECK: call void @_ZN5test23foo1fEv 69 // CHECK: call %"struct.test2::foo"* @_ZN5test23fooD1Ev 70 b->foo::f(); 71 b->foo::~foo(); 72 } 73} 74 75namespace test3 { 76 // Test that we don't crash in this case. 77 struct B { 78 }; 79 struct D : public B { 80 }; 81 void f(D d) { 82 // CHECK-LABEL: define void @_ZN5test31fENS_1DE 83 d.B::~B(); 84 } 85} 86 87namespace test4 { 88 struct Animal { 89 virtual void eat(); 90 }; 91 struct Fish : Animal { 92 virtual void eat(); 93 }; 94 struct Wrapper { 95 Fish fish; 96 }; 97 extern Wrapper *p; 98 void test() { 99 // CHECK: call void @_ZN5test44Fish3eatEv 100 p->fish.eat(); 101 } 102} 103