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 111 namespace Test7 { 112 struct foo { 113 virtual void g() {} 114 }; 115 116 struct bar { 117 virtual int f() { return 0; } 118 }; 119 120 struct zed final : public foo, public bar { 121 int z; 122 virtual int f() {return z;} 123 }; 124 125 // CHECK: define i32 @_ZN5Test71fEPNS_3zedE 126 int f(zed *z) { 127 // CHECK: alloca 128 // CHECK-NEXT: store 129 // CHECK-NEXT: load 130 // CHECK-NEXT: bitcast 131 // CHECK-NEXT: call {{.*}} @_ZN5Test73zed1fEv 132 // CHECK-NEXT: ret 133 return static_cast<bar*>(z)->f(); 134 } 135 } 136