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
f(A * a)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
f(B * b)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
f(B * b)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
f(A * p)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