1 // RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - | FileCheck %s 2 3 namespace Test1 { 4 struct A { 5 virtual int f() final; 6 }; 7 8 // CHECK: define i32 @_ZN5Test11fEPNS_1AE 9 int f(A *a) { 10 // CHECK: call i32 @_ZN5Test11A1fEv 11 return a->f(); 12 } 13 } 14 15 namespace Test2 { 16 struct A final { 17 virtual int f(); 18 }; 19 20 // CHECK: define i32 @_ZN5Test21fEPNS_1AE 21 int f(A *a) { 22 // CHECK: call i32 @_ZN5Test21A1fEv 23 return a->f(); 24 } 25 } 26 27 namespace Test3 { 28 struct A { 29 virtual int f(); 30 }; 31 32 struct B final : A { }; 33 34 // CHECK: define i32 @_ZN5Test31fEPNS_1BE 35 int f(B *b) { 36 // CHECK: call i32 @_ZN5Test31A1fEv 37 return b->f(); 38 } 39 40 // CHECK: define i32 @_ZN5Test31fERNS_1BE 41 int f(B &b) { 42 // CHECK: call i32 @_ZN5Test31A1fEv 43 return b.f(); 44 } 45 46 // CHECK: define i32 @_ZN5Test31fEPv 47 int f(void *v) { 48 // CHECK: call i32 @_ZN5Test31A1fEv 49 return static_cast<B*>(v)->f(); 50 } 51 } 52 53 namespace Test4 { 54 struct A { 55 virtual void f(); 56 }; 57 58 struct B final : A { 59 virtual void f(); 60 }; 61 62 // CHECK: define void @_ZN5Test41fEPNS_1BE 63 void f(B* d) { 64 // CHECK: call void @_ZN5Test41B1fEv 65 static_cast<A*>(d)->f(); 66 } 67 } 68 69 namespace Test5 { 70 struct A { 71 virtual void f(); 72 }; 73 74 struct B : A { 75 virtual void f(); 76 }; 77 78 struct C final : B { 79 }; 80 81 // CHECK: define void @_ZN5Test51fEPNS_1CE 82 void f(C* d) { 83 // CHECK: call void @_ZN5Test51B1fEv 84 static_cast<A*>(d)->f(); 85 } 86 } 87 88 namespace Test6 { 89 struct A { 90 virtual ~A(); 91 }; 92 93 struct B : public A { 94 virtual ~B(); 95 }; 96 97 struct C { 98 virtual ~C(); 99 }; 100 101 struct D final : public C, public B { 102 }; 103 104 // CHECK: define void @_ZN5Test61fEPNS_1DE 105 void f(D* d) { 106 // CHECK: call void @_ZN5Test61DD1Ev 107 static_cast<A*>(d)->~A(); 108 } 109 } 110