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