xref: /llvm-project/clang/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp (revision c53d9e8350cb68d548161612f9ac494d3ed835bf)
1 // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
2 
3 struct A {
4   virtual void f();
5   virtual void f_const() const;
6 
7   A h();
8 };
9 
10 A g();
11 
12 void 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 
40 struct B {
41   virtual void f();
42   ~B();
43 
44   B h();
45 };
46 
47 
48 void f() {
49   // CHECK: call void @_ZN1B1fEv
50   B().f();
51 
52   // CHECK: call void @_ZN1B1fEv
53   B().h().f();
54 }
55 
56