xref: /llvm-project/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp (revision 49e860b248add5ef49fc967a1b503da74b0c3f95)
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