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 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