blob: ba92012bce35ad134bdd5776ce0414705926941c [file] [log] [blame]
Rafael Espindola0b4fe502012-06-26 17:45:31 +00001// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - | FileCheck %s
Anders Carlssonf89e0422011-01-23 21:07:30 +00002
3namespace 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
15namespace 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}
Anders Carlsson1679f5a2011-01-29 03:52:01 +000026
27namespace 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 }
Anders Carlsson268ab8c2011-01-29 05:04:11 +000039
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 }
Anders Carlsson1679f5a2011-01-29 03:52:01 +000051}
Rafael Espindola0b4fe502012-06-26 17:45:31 +000052
53namespace 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
69namespace 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
88namespace 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}
Rafael Espindola632fbaa2012-06-28 01:56:38 +0000110
111namespace 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}