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