|
1 |
| -/* Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc. |
| 1 | +/* Copyright (C) 1991-2024 Free Software Foundation, Inc. |
2 | 2 | This file is part of the GNU C Library.
|
3 | 3 |
|
4 | 4 | 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. |
8 | 8 |
|
9 | 9 | The GNU C Library is distributed in the hope that it will be useful,
|
10 | 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11 | 11 | 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. |
13 | 13 |
|
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 |
15 | 15 | License along with the GNU C Library; if not, see
|
16 | 16 | <https://www.gnu.org/licenses/>. */
|
17 | 17 |
|
18 |
| -/* Modified for MiNTLib by Guido Flohr <guido@freemint.de>. */ |
19 |
| - |
20 | 18 | /*
|
21 |
| - * ISO C Standard: 4.2 DIAGNOSTICS <assert.h> |
| 19 | + * ISO C99 Standard: 7.2 Diagnostics <assert.h> |
22 | 20 | */
|
23 | 21 |
|
24 | 22 | #ifdef _ASSERT_H
|
25 | 23 |
|
26 | 24 | # undef _ASSERT_H
|
27 | 25 | # undef assert
|
| 26 | +# undef __ASSERT_VOID_CAST |
28 | 27 |
|
29 | 28 | # ifdef __USE_GNU
|
30 | 29 | # undef assert_perror
|
|
33 | 32 | #endif /* assert.h */
|
34 | 33 |
|
35 | 34 | #define _ASSERT_H 1
|
| 35 | +#include <features.h> |
36 | 36 |
|
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) |
43 | 41 | #endif
|
44 | 42 |
|
45 | 43 | /* void assert (int expression);
|
|
49 | 47 |
|
50 | 48 | #ifdef NDEBUG
|
51 | 49 |
|
52 |
| -# define assert(expr) ((void) 0) |
| 50 | +# define assert(expr) (__ASSERT_VOID_CAST (0)) |
53 | 51 |
|
54 | 52 | /* void assert_perror (int errnum);
|
55 | 53 |
|
|
58 | 56 | (This is a GNU extension.) */
|
59 | 57 |
|
60 | 58 | # ifdef __USE_GNU
|
61 |
| -# define assert_perror(errnum) ((void) 0) |
| 59 | +# define assert_perror(errnum) (__ASSERT_VOID_CAST (0)) |
62 | 60 | # endif
|
63 | 61 |
|
64 | 62 | #else /* Not NDEBUG. */
|
65 | 63 |
|
66 | 64 | __BEGIN_DECLS
|
67 | 65 |
|
68 | 66 | /* 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__)); |
74 | 70 |
|
75 | 71 | /* 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 | + |
81 | 82 |
|
82 | 83 | __END_DECLS
|
83 | 84 |
|
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 |
88 | 123 |
|
89 | 124 | # 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)) |
94 | 129 | # endif
|
95 | 130 |
|
96 | 131 | /* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__'
|
97 | 132 | 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__ |
101 | 138 | # 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 |
103 | 144 | # endif
|
104 | 145 |
|
105 |
| - |
106 | 146 | #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