17
17
# pragma GCC system_header
18
18
#endif
19
19
20
- _LIBCPP_BEGIN_NAMESPACE_STD
21
-
22
- _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR int
23
- __assertion_failed_during_constant_evaluation (bool __value, const char *) _NOEXCEPT {
24
- return __value ? 0 : (__builtin_unreachable (), 0 );
25
- }
26
-
27
- _LIBCPP_END_NAMESPACE_STD
28
-
29
20
#define _LIBCPP_ASSERT_IS_CONSTANT_EVALUATED \
30
21
(_LIBCPP_DIAGNOSTIC_PUSH _LIBCPP_CLANG_DIAGNOSTIC_IGNORED (" -Wconstant-evaluated" ) __builtin_is_constant_evaluated() \
31
22
_LIBCPP_DIAGNOSTIC_POP)
32
23
33
- #define _LIBCPP_ASSERTTION_MESSAGE (__message ) \
34
- __FILE__ " :" _LIBCPP_TOSTRING(__LINE__) " : assertion " _LIBCPP_TOSTRING(expression) " failed: " __message " \n "
35
-
36
24
#define _LIBCPP_ASSERT (expression, message ) \
37
25
(__builtin_expect(static_cast <bool >(expression), 1 ) ? (void )0 \
38
26
: _LIBCPP_ASSERT_IS_CONSTANT_EVALUATED \
39
- ? (void )__assertion_failed_during_constant_evaluation(false , _LIBCPP_ASSERTTION_MESSAGE(message)) \
40
- : _LIBCPP_ASSERTION_HANDLER(_LIBCPP_ASSERTTION_MESSAGE(message)))
27
+ ? __builtin_unreachable() \
28
+ : _LIBCPP_ASSERTION_HANDLER(__FILE__ " :" _LIBCPP_TOSTRING(__LINE__) " : assertion " _LIBCPP_TOSTRING( \
29
+ expression) " failed: " message " \n " ))
41
30
42
31
// TODO: __builtin_assume can currently inhibit optimizations. Until this has been fixed and we can add
43
32
// assumptions without a clear optimization intent, disable that to avoid worsening the code generation.
@@ -50,10 +39,9 @@ _LIBCPP_END_NAMESPACE_STD
50
39
# define _LIBCPP_RUNTIME_ASSUME (expression ) ((void )0 )
51
40
#endif
52
41
53
- #define _LIBCPP_ASSUME (expression, message ) \
42
+ #define _LIBCPP_ASSUME (expression ) \
54
43
(_LIBCPP_ASSERT_IS_CONSTANT_EVALUATED \
55
- ? (void )__assertion_failed_during_constant_evaluation( \
56
- static_cast <bool >(expression), _LIBCPP_ASSERTTION_MESSAGE(message)) \
44
+ ? static_cast <bool >(expression) ? (void )0 : __builtin_unreachable() \
57
45
: _LIBCPP_RUNTIME_ASSUME(expression))
58
46
59
47
// clang-format off
@@ -66,18 +54,18 @@ _LIBCPP_END_NAMESPACE_STD
66
54
# define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS (expression, message ) _LIBCPP_ASSERT(expression, message)
67
55
// Disabled checks.
68
56
// On most modern platforms, dereferencing a null pointer does not lead to an actual memory access.
69
- # define _LIBCPP_ASSERT_NON_NULL (expression, message ) _LIBCPP_ASSUME(expression, message )
57
+ # define _LIBCPP_ASSERT_NON_NULL (expression, message ) _LIBCPP_ASSUME(expression)
70
58
// Overlapping ranges will make algorithms produce incorrect results but don't directly lead to a security
71
59
// vulnerability.
72
- # define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES (expression, message ) _LIBCPP_ASSUME(expression, message )
73
- # define _LIBCPP_ASSERT_VALID_DEALLOCATION (expression, message ) _LIBCPP_ASSUME(expression, message )
74
- # define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL (expression, message ) _LIBCPP_ASSUME(expression, message )
75
- # define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR (expression, message ) _LIBCPP_ASSUME(expression, message )
76
- # define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN (expression, message ) _LIBCPP_ASSUME(expression, message )
77
- # define _LIBCPP_ASSERT_PEDANTIC (expression, message ) _LIBCPP_ASSUME(expression, message )
78
- # define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT (expression, message ) _LIBCPP_ASSUME(expression, message )
79
- # define _LIBCPP_ASSERT_INTERNAL (expression, message ) _LIBCPP_ASSUME(expression, message )
80
- # define _LIBCPP_ASSERT_UNCATEGORIZED (expression, message ) _LIBCPP_ASSUME(expression, message )
60
+ # define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES (expression, message ) _LIBCPP_ASSUME(expression)
61
+ # define _LIBCPP_ASSERT_VALID_DEALLOCATION (expression, message ) _LIBCPP_ASSUME(expression)
62
+ # define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL (expression, message ) _LIBCPP_ASSUME(expression)
63
+ # define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR (expression, message ) _LIBCPP_ASSUME(expression)
64
+ # define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN (expression, message ) _LIBCPP_ASSUME(expression)
65
+ # define _LIBCPP_ASSERT_PEDANTIC (expression, message ) _LIBCPP_ASSUME(expression)
66
+ # define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT (expression, message ) _LIBCPP_ASSUME(expression)
67
+ # define _LIBCPP_ASSERT_INTERNAL (expression, message ) _LIBCPP_ASSUME(expression)
68
+ # define _LIBCPP_ASSERT_UNCATEGORIZED (expression, message ) _LIBCPP_ASSUME(expression)
81
69
82
70
// Extensive hardening mode checks.
83
71
@@ -95,8 +83,8 @@ _LIBCPP_END_NAMESPACE_STD
95
83
# define _LIBCPP_ASSERT_PEDANTIC (expression, message ) _LIBCPP_ASSERT(expression, message)
96
84
# define _LIBCPP_ASSERT_UNCATEGORIZED (expression, message ) _LIBCPP_ASSERT(expression, message)
97
85
// Disabled checks.
98
- # define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT (expression, message ) _LIBCPP_ASSUME(expression, message )
99
- # define _LIBCPP_ASSERT_INTERNAL (expression, message ) _LIBCPP_ASSUME(expression, message )
86
+ # define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT (expression, message ) _LIBCPP_ASSUME(expression)
87
+ # define _LIBCPP_ASSERT_INTERNAL (expression, message ) _LIBCPP_ASSUME(expression)
100
88
101
89
// Debug hardening mode checks.
102
90
@@ -121,18 +109,18 @@ _LIBCPP_END_NAMESPACE_STD
121
109
#else
122
110
123
111
// All checks disabled.
124
- # define _LIBCPP_ASSERT_VALID_INPUT_RANGE (expression, message ) _LIBCPP_ASSUME(expression, message )
125
- # define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS (expression, message ) _LIBCPP_ASSUME(expression, message )
126
- # define _LIBCPP_ASSERT_NON_NULL (expression, message ) _LIBCPP_ASSUME(expression, message )
127
- # define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES (expression, message ) _LIBCPP_ASSUME(expression, message )
128
- # define _LIBCPP_ASSERT_VALID_DEALLOCATION (expression, message ) _LIBCPP_ASSUME(expression, message )
129
- # define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL (expression, message ) _LIBCPP_ASSUME(expression, message )
130
- # define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR (expression, message ) _LIBCPP_ASSUME(expression, message )
131
- # define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN (expression, message ) _LIBCPP_ASSUME(expression, message )
132
- # define _LIBCPP_ASSERT_PEDANTIC (expression, message ) _LIBCPP_ASSUME(expression, message )
133
- # define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT (expression, message ) _LIBCPP_ASSUME(expression, message )
134
- # define _LIBCPP_ASSERT_INTERNAL (expression, message ) _LIBCPP_ASSUME(expression, message )
135
- # define _LIBCPP_ASSERT_UNCATEGORIZED (expression, message ) _LIBCPP_ASSUME(expression, message )
112
+ # define _LIBCPP_ASSERT_VALID_INPUT_RANGE (expression, message ) _LIBCPP_ASSUME(expression)
113
+ # define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS (expression, message ) _LIBCPP_ASSUME(expression)
114
+ # define _LIBCPP_ASSERT_NON_NULL (expression, message ) _LIBCPP_ASSUME(expression)
115
+ # define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES (expression, message ) _LIBCPP_ASSUME(expression)
116
+ # define _LIBCPP_ASSERT_VALID_DEALLOCATION (expression, message ) _LIBCPP_ASSUME(expression)
117
+ # define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL (expression, message ) _LIBCPP_ASSUME(expression)
118
+ # define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR (expression, message ) _LIBCPP_ASSUME(expression)
119
+ # define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN (expression, message ) _LIBCPP_ASSUME(expression)
120
+ # define _LIBCPP_ASSERT_PEDANTIC (expression, message ) _LIBCPP_ASSUME(expression)
121
+ # define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT (expression, message ) _LIBCPP_ASSUME(expression)
122
+ # define _LIBCPP_ASSERT_INTERNAL (expression, message ) _LIBCPP_ASSUME(expression)
123
+ # define _LIBCPP_ASSERT_UNCATEGORIZED (expression, message ) _LIBCPP_ASSUME(expression)
136
124
137
125
#endif // _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_FAST
138
126
// clang-format on
0 commit comments