11// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=unreachable | FileCheck %s
22
3- void abort () __attribute__((noreturn));
3+ extern void __attribute__ ((noreturn)) abort( );
44
5- // CHECK-LABEL: define void @_Z14calls_noreturnv()
5+ // CHECK-LABEL: define void @_Z14calls_noreturnv
66void calls_noreturn () {
7- // Check absence ([^#]*) of call site attributes (including noreturn)
8- // CHECK: call void @_Z5abortv(){{[^#]*}}
97 abort ();
108
9+ // Check that there are no attributes on the call site.
10+ // CHECK-NOT: call void @_Z5abortv{{.*}}#
11+
1112 // CHECK: __ubsan_handle_builtin_unreachable
1213 // CHECK: unreachable
1314}
1415
1516struct A {
16- // CHECK: declare void @_Z5abortv() [[EXTERN_FN_ATTR :#[0-9]+]]
17+ // CHECK: declare void @_Z5abortv{{.*}} [[ABORT_ATTR :#[0-9]+]]
1718
1819 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call1Ev
1920 void call1 () {
20- // CHECK: call void @_ZN1A16does_not_return2Ev( {{.*}}){{[^#]*}}
21+ // CHECK-NOT : call void @_ZN1A16does_not_return2Ev{{.*}}#
2122 does_not_return2 ();
2223
2324 // CHECK: __ubsan_handle_builtin_unreachable
2425 // CHECK: unreachable
2526 }
2627
27- // Test static members. Checks are below after `struct A` scope ends.
28- static void does_not_return1 () __attribute__((noreturn)) {
28+ // Test static members.
29+ static void __attribute__ ((noreturn)) does_not_return1() {
30+ // CHECK-NOT: call void @_Z5abortv{{.*}}#
2931 abort ();
3032 }
3133
3234 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call2Ev
3335 void call2 () {
34- // CHECK: call void @_ZN1A16does_not_return1Ev(){{[^#] *}}
36+ // CHECK-NOT : call void @_ZN1A16does_not_return1Ev{{. *}}#
3537 does_not_return1 ();
3638
3739 // CHECK: __ubsan_handle_builtin_unreachable
3840 // CHECK: unreachable
3941 }
4042
4143 // Test calls through pointers to non-static member functions.
42- typedef void ( A::*MemFn)() __attribute__((noreturn) );
44+ typedef void __attribute__ ((noreturn)) ( A::*MemFn)();
4345
4446 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call3Ev
4547 void call3 () {
4648 MemFn MF = &A::does_not_return2;
47- // CHECK: call void %{{[0-9]+\(.*}}){{[^#]*}}
4849 (this ->*MF)();
4950
51+ // CHECK-NOT: call void %{{.*}}#
5052 // CHECK: __ubsan_handle_builtin_unreachable
5153 // CHECK: unreachable
5254 }
5355
5456 // Test regular members.
5557 // CHECK-LABEL: define linkonce_odr void @_ZN1A16does_not_return2Ev({{.*}})
56- // CHECK-SAME: [[USER_FN_ATTR :#[0-9]+]]
57- void does_not_return2 () __attribute__((noreturn)) {
58- // CHECK: call void @_Z5abortv(){{[^#] *}}
58+ // CHECK-SAME: [[DOES_NOT_RETURN_ATTR :#[0-9]+]]
59+ void __attribute__ ((noreturn)) does_not_return2( ) {
60+ // CHECK-NOT : call void @_Z5abortv(){{. *}}#
5961 abort ();
6062
6163 // CHECK: call void @__ubsan_handle_builtin_unreachable
@@ -66,9 +68,7 @@ struct A {
6668 }
6769};
6870
69- // CHECK-LABEL: define linkonce_odr void @_ZN1A16does_not_return1Ev()
70- // CHECK-SAME: [[USER_FN_ATTR]]
71- // CHECK: call void @_Z5abortv(){{[^#]*}}
71+ // CHECK: define linkonce_odr void @_ZN1A16does_not_return1Ev() [[DOES_NOT_RETURN_ATTR]]
7272
7373void force_irgen () {
7474 A a;
@@ -77,7 +77,5 @@ void force_irgen() {
7777 a.call3 ();
7878}
7979
80- // `noreturn` should be removed from functions and call sites
81- // CHECK-LABEL: attributes
82- // CHECK-NOT: [[USER_FN_ATTR]] = { {{.*noreturn.*}} }
83- // CHECK-NOT: [[EXTERN_FN_ATTR]] = { {{.*noreturn.*}} }
80+ // CHECK-NOT: [[ABORT_ATTR]] = {{[^}]+}}noreturn
81+ // CHECK-NOT: [[DOES_NOT_RETURN_ATTR]] = {{[^}]+}}noreturn
0 commit comments