1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=unreachable | FileCheck %s 2 3 extern void __attribute__((noreturn)) abort(); 4 5 // CHECK-LABEL: define void @_Z14calls_noreturnv 6 void calls_noreturn() { 7 abort(); 8 9 // Check that there are no attributes on the call site. 10 // CHECK-NOT: call void @_Z5abortv{{.*}}# 11 12 // CHECK: __ubsan_handle_builtin_unreachable 13 // CHECK: unreachable 14 } 15 16 struct A { 17 // CHECK: declare void @_Z5abortv{{.*}} [[ABORT_ATTR:#[0-9]+]] 18 19 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call1Ev 20 void call1() { 21 // CHECK-NOT: call void @_ZN1A16does_not_return2Ev{{.*}}# 22 does_not_return2(); 23 24 // CHECK: __ubsan_handle_builtin_unreachable 25 // CHECK: unreachable 26 } 27 28 // Test static members. 29 static void __attribute__((noreturn)) does_not_return1() { 30 // CHECK-NOT: call void @_Z5abortv{{.*}}# 31 abort(); 32 } 33 34 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call2Ev 35 void call2() { 36 // CHECK-NOT: call void @_ZN1A16does_not_return1Ev{{.*}}# 37 does_not_return1(); 38 39 // CHECK: __ubsan_handle_builtin_unreachable 40 // CHECK: unreachable 41 } 42 43 // Test calls through pointers to non-static member functions. 44 typedef void __attribute__((noreturn)) (A::*MemFn)(); 45 46 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call3Ev 47 void call3() { 48 MemFn MF = &A::does_not_return2; 49 (this->*MF)(); 50 51 // CHECK-NOT: call void %{{.*}}# 52 // CHECK: __ubsan_handle_builtin_unreachable 53 // CHECK: unreachable 54 } 55 56 // Test regular members. 57 // CHECK-LABEL: define linkonce_odr void @_ZN1A16does_not_return2Ev({{.*}}) 58 // CHECK-SAME: [[DOES_NOT_RETURN_ATTR:#[0-9]+]] 59 void __attribute__((noreturn)) does_not_return2() { 60 // CHECK-NOT: call void @_Z5abortv(){{.*}}# 61 abort(); 62 63 // CHECK: call void @__ubsan_handle_builtin_unreachable 64 // CHECK: unreachable 65 66 // CHECK: call void @__ubsan_handle_builtin_unreachable 67 // CHECK: unreachable 68 } 69 }; 70 71 // CHECK: define linkonce_odr void @_ZN1A16does_not_return1Ev() [[DOES_NOT_RETURN_ATTR]] 72 73 void force_irgen() { 74 A a; 75 a.call1(); 76 a.call2(); 77 a.call3(); 78 } 79 80 // CHECK-NOT: [[ABORT_ATTR]] = {{[^}]+}}noreturn 81 // CHECK-NOT: [[DOES_NOT_RETURN_ATTR]] = {{[^}]+}}noreturn 82