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
calls_noreturn()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
call1A20 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.
does_not_return1A29 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
call2A35 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
call3A47 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]+]]
does_not_return2A59 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
force_irgen()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