Skip to content

Commit dbfab2d

Browse files
committed
Update assert.h from recent glibc
This also helps with some asserts where the expression is return value from a function and thrown away afterwards.
1 parent 77bdf31 commit dbfab2d

File tree

1 file changed

+90
-40
lines changed

1 file changed

+90
-40
lines changed

include/assert.h

Lines changed: 90 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,29 @@
1-
/* Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
1+
/* Copyright (C) 1991-2024 Free Software Foundation, Inc.
22
This file is part of the GNU C Library.
33
44
The GNU C Library is free software; you can redistribute it and/or
5-
modify it under the terms of the GNU Library General Public License as
6-
published by the Free Software Foundation; either version 2 of the
7-
License, or (at your option) any later version.
5+
modify it under the terms of the GNU Lesser General Public
6+
License as published by the Free Software Foundation; either
7+
version 2.1 of the License, or (at your option) any later version.
88
99
The GNU C Library is distributed in the hope that it will be useful,
1010
but WITHOUT ANY WARRANTY; without even the implied warranty of
1111
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12-
Library General Public License for more details.
12+
Lesser General Public License for more details.
1313
14-
You should have received a copy of the GNU Library General Public
14+
You should have received a copy of the GNU Lesser General Public
1515
License along with the GNU C Library; if not, see
1616
<https://www.gnu.org/licenses/>. */
1717

18-
/* Modified for MiNTLib by Guido Flohr <guido@freemint.de>. */
19-
2018
/*
21-
* ISO C Standard: 4.2 DIAGNOSTICS <assert.h>
19+
* ISO C99 Standard: 7.2 Diagnostics <assert.h>
2220
*/
2321

2422
#ifdef _ASSERT_H
2523

2624
# undef _ASSERT_H
2725
# undef assert
26+
# undef __ASSERT_VOID_CAST
2827

2928
# ifdef __USE_GNU
3029
# undef assert_perror
@@ -33,13 +32,12 @@
3332
#endif /* assert.h */
3433

3534
#define _ASSERT_H 1
35+
#include <features.h>
3636

37-
#ifndef _FEATURES_H
38-
# include <features.h>
39-
#endif
40-
41-
#ifndef _SYS_CDEFS_H
42-
# include <sys/cdefs.h>
37+
#if defined __cplusplus && __GNUC_PREREQ (2,95)
38+
# define __ASSERT_VOID_CAST static_cast<void>
39+
#else
40+
# define __ASSERT_VOID_CAST (void)
4341
#endif
4442

4543
/* void assert (int expression);
@@ -49,7 +47,7 @@
4947

5048
#ifdef NDEBUG
5149

52-
# define assert(expr) ((void) 0)
50+
# define assert(expr) (__ASSERT_VOID_CAST (0))
5351

5452
/* void assert_perror (int errnum);
5553
@@ -58,49 +56,101 @@
5856
(This is a GNU extension.) */
5957

6058
# ifdef __USE_GNU
61-
# define assert_perror(errnum) ((void) 0)
59+
# define assert_perror(errnum) (__ASSERT_VOID_CAST (0))
6260
# endif
6361

6462
#else /* Not NDEBUG. */
6563

6664
__BEGIN_DECLS
6765

6866
/* This prints an "Assertion failed" message and aborts. */
69-
extern void __assert_fail (const char *__assertion,
70-
const char *__file,
71-
unsigned int __line,
72-
const char *__function)
73-
__attribute__ ((__noreturn__));
67+
extern void __assert_fail (const char *__assertion, const char *__file,
68+
unsigned int __line, const char *__function)
69+
__THROW __attribute__ ((__noreturn__));
7470

7571
/* Likewise, but prints the error text for ERRNUM. */
76-
extern void __assert_perror_fail (int __errnum,
77-
const char *__file,
78-
unsigned int __line,
79-
const char *__function)
80-
__attribute__ ((__noreturn__));
72+
extern void __assert_perror_fail (int __errnum, const char *__file,
73+
unsigned int __line, const char *__function)
74+
__THROW __attribute__ ((__noreturn__));
75+
76+
77+
/* The following is not at all used here but needed for standard
78+
compliance. */
79+
extern void __assert (const char *__assertion, const char *__file, int __line)
80+
__THROW __attribute__ ((__noreturn__));
81+
8182

8283
__END_DECLS
8384

84-
# define assert(expr) \
85-
((void) ((expr) ? 0 : \
86-
(__assert_fail (__STRING(expr), \
87-
__FILE__, __LINE__, __ASSERT_FUNCTION), 0)))
85+
/* When possible, define assert so that it does not add extra
86+
parentheses around EXPR. Otherwise, those added parentheses would
87+
suppress warnings we'd expect to be detected by gcc's -Wparentheses. */
88+
# if defined __cplusplus
89+
# if defined __has_builtin
90+
# if __has_builtin (__builtin_FILE)
91+
# define __ASSERT_FILE __builtin_FILE ()
92+
# define __ASSERT_LINE __builtin_LINE ()
93+
# endif
94+
# endif
95+
# if !defined __ASSERT_FILE
96+
# define __ASSERT_FILE __FILE__
97+
# define __ASSERT_LINE __LINE__
98+
# endif
99+
# define assert(expr) \
100+
(static_cast <bool> (expr) \
101+
? void (0) \
102+
: __assert_fail (#expr, __ASSERT_FILE, __ASSERT_LINE, \
103+
__ASSERT_FUNCTION))
104+
# elif !defined __GNUC__ || defined __STRICT_ANSI__
105+
# define assert(expr) \
106+
((expr) \
107+
? __ASSERT_VOID_CAST (0) \
108+
: __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
109+
# else
110+
/* The first occurrence of EXPR is not evaluated due to the sizeof,
111+
but will trigger any pedantic warnings masked by the __extension__
112+
for the second occurrence. The ternary operator is required to
113+
support function pointers and bit fields in this context, and to
114+
suppress the evaluation of variable length arrays. */
115+
# define assert(expr) \
116+
((void) sizeof ((expr) ? 1 : 0), __extension__ ({ \
117+
if (expr) \
118+
; /* empty */ \
119+
else \
120+
__assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION); \
121+
}))
122+
# endif
88123

89124
# ifdef __USE_GNU
90-
# define assert_perror(errnum) \
91-
((void) (!(errnum) ? 0 : (__assert_perror_fail ((errnum), \
92-
__FILE__, __LINE__, \
93-
__ASSERT_FUNCTION), 0)))
125+
# define assert_perror(errnum) \
126+
(!(errnum) \
127+
? __ASSERT_VOID_CAST (0) \
128+
: __assert_perror_fail ((errnum), __FILE__, __LINE__, __ASSERT_FUNCTION))
94129
# endif
95130

96131
/* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__'
97132
which contains the name of the function currently being defined.
98-
This is broken in G++ before version 2.6. */
99-
# if (!(defined(__cplusplus) ? __GNUC_PREREQ(2,6) : __GNUC_PREREQ(2,4)))
100-
# define __ASSERT_FUNCTION ((const char *) 0)
133+
This is broken in G++ before version 2.6.
134+
C9x has a similar variable called __func__, but prefer the GCC one since
135+
it demangles C++ function names. */
136+
# if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)
137+
# define __ASSERT_FUNCTION __extension__ __PRETTY_FUNCTION__
101138
# else
102-
# define __ASSERT_FUNCTION __PRETTY_FUNCTION__
139+
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
140+
# define __ASSERT_FUNCTION __func__
141+
# else
142+
# define __ASSERT_FUNCTION ((const char *) 0)
143+
# endif
103144
# endif
104145

105-
106146
#endif /* NDEBUG. */
147+
148+
149+
#if (defined __USE_ISOC11 \
150+
&& (!defined __STDC_VERSION__ \
151+
|| __STDC_VERSION__ <= 201710L \
152+
|| !__GNUC_PREREQ (13, 0)) \
153+
&& !defined __cplusplus)
154+
# undef static_assert
155+
# define static_assert _Static_assert
156+
#endif

0 commit comments

Comments
 (0)