Clang Project

clang_source_code/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
5namespace PR5021 {
6
7struct A {
8  virtual void f(char);
9};
10
11void f(A *a) {
12  // CHECK: call {{.*}}void %
13  a->f('c');
14}
15
16struct B : virtual A { 
17  virtual void f();
18};
19
20void f(B * b) {
21  b->f();
22}
23
24}
25
26namespace 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
41namespace 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]] = !{}
57