]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGenCXX/virtual-function-calls.cpp
Vendor import of clang trunk r338150:
[FreeBSD/FreeBSD.git] / test / CodeGenCXX / virtual-function-calls.cpp
1 // RUN: %clang_cc1 %s -triple %itanium_abi_triple -std=c++11 -emit-llvm -o - | FileCheck %s
2 // RUN: %clang_cc1 %s -triple %itanium_abi_triple -std=c++11 -emit-llvm -o - -fstrict-vtable-pointers -O1 | FileCheck --check-prefix=CHECK-INVARIANT %s
3
4 // PR5021
5 namespace PR5021 {
6
7 struct A {
8   virtual void f(char);
9 };
10
11 void f(A *a) {
12   // CHECK: call {{.*}}void %
13   a->f('c');
14 }
15
16 struct B : virtual A { 
17   virtual void f();
18 };
19
20 void f(B * b) {
21   b->f();
22 }
23
24 }
25
26 namespace Test1 {
27   struct A { 
28     virtual ~A(); 
29   };
30
31   struct B : A {
32     virtual ~B();
33     virtual void f();
34   };
35
36   void f(B *b) {
37     b->f();
38   }
39 }
40
41 namespace VirtualNoreturn {
42   struct A {
43     [[noreturn]] virtual void f();
44   };
45
46   // CHECK-LABEL: @_ZN15VirtualNoreturn1f
47   // CHECK-INVARIANT-LABEL: define {{(dso_local )?}}void @_ZN15VirtualNoreturn1f
48   void f(A *p) {
49     p->f();
50     // CHECK: call {{.*}}void %{{[^#]*$}}
51     // CHECK-NOT: unreachable
52     // CHECK-INVARIANT: load {{.*}} !invariant.load ![[EMPTY_NODE:[0-9]+]]
53   }
54 }
55
56 // CHECK-INVARIANT: ![[EMPTY_NODE]] = !{}