1
0
mirror of https://git.FreeBSD.org/src.git synced 2026-06-02 11:24:32 +00:00

libc: Add variadic assert in accordance with C23

Signed-off-by:	Faraz Vahedi <kfv@kfv.io>
Reviewed by:	fuz
MFC after:	1 month
Pull Request:	https://github.com/freebsd/freebsd-src/pull/2203
This commit is contained in:
Faraz Vahedi
2026-05-28 11:01:29 +03:30
committed by Robert Clausecker
parent 157c184689
commit 867b51452e
+35 -7
View File
@@ -46,16 +46,43 @@
#undef __assert_unreachable
#ifdef NDEBUG
#define assert(e) ((void)0)
#define _assert(e) ((void)0)
#define assert(...) ((void)0)
#define _assert(...) ((void)0)
#if __BSD_VISIBLE
#define __assert_unreachable() __unreachable()
#endif /* __BSD_VISIBLE */
#else
#define _assert(e) assert(e)
#define assert(e) ((e) ? (void)0 : __assert(__func__, __FILE__, \
__LINE__, #e))
#ifdef __cplusplus
#if __cplusplus < 202002L
/*
* C++ modes prior to C++20 cannot simultaneously satisfy all three
* desirable properties of the sanitiser:
*
* Approach No double-eval Lambda support Arity check
* ----------------------------- -------------- -------------- -----------
* sizeof(cast(expression)) yes no yes
* static_cast<bool>(expression) no yes no
* (void)bool(expression) no yes no
*
* NOTE: C++20 introduced lambdas in unevaluated contexts; see P0315R4.
*
* Since no approach satisfies all three below C++20, the least harmful
* choice is to forgo the check entirely rather than silently break one
* of the remaining guarantees.
*
*/
#define __assert_sanitize(...) ((void)0)
#else
#define __assert_sanitize(...) (void)sizeof(((bool(*)(bool))0)(__VA_ARGS__))
#endif /* __cplusplus < 202002L */
#else
#define __assert_sanitize(...) (void)sizeof(((_Bool(*)(_Bool))0)(__VA_ARGS__))
#endif /* __cplusplus */
#define assert(...) (__assert_sanitize(__VA_ARGS__), \
(__VA_ARGS__) ? (void)0 : \
__assert(__func__, __FILE__, \
__LINE__, #__VA_ARGS__))
#define _assert(...) assert(__VA_ARGS__)
#if __BSD_VISIBLE
#define __assert_unreachable() assert(0 && "unreachable segment reached")
#endif /* __BSD_VISIBLE */
@@ -76,7 +103,8 @@
* C23 defines static_assert and its obsolescent alternative spelling,
* _Static_assert, as keywords.
*/
#if __ISO_C_VISIBLE >= 2011 && __ISO_C_VISIBLE < 2023 && !defined(__cplusplus)
#if __ISO_C_VISIBLE >= 2011 && !defined(__cplusplus) && \
__STDC_VERSION__ < 202311L
#define static_assert _Static_assert
#endif