]>
Commit | Line | Data |
---|---|---|
8ecd6b2a | 1 | /* Copyright (C) 1991,1992,1994-2001,2003,2004,2007,2011,2012 |
b3715c05 | 2 | Free Software Foundation, Inc. |
ba1ffaa1 | 3 | This file is part of the GNU C Library. |
28f540f4 | 4 | |
ba1ffaa1 | 5 | The GNU C Library is free software; you can redistribute it and/or |
41bdb6e2 AJ |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
28f540f4 | 9 | |
ba1ffaa1 UD |
10 | The GNU C Library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 13 | Lesser General Public License for more details. |
28f540f4 | 14 | |
41bdb6e2 AJ |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library; if not, write to the Free | |
17 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
18 | 02111-1307 USA. */ | |
28f540f4 RM |
19 | |
20 | /* | |
d1646309 | 21 | * ISO C99 Standard: 7.2 Diagnostics <assert.h> |
28f540f4 RM |
22 | */ |
23 | ||
24 | #ifdef _ASSERT_H | |
25 | ||
40a55d20 UD |
26 | # undef _ASSERT_H |
27 | # undef assert | |
fd205052 | 28 | # undef __ASSERT_VOID_CAST |
40a55d20 UD |
29 | |
30 | # ifdef __USE_GNU | |
31 | # undef assert_perror | |
32 | # endif | |
28f540f4 RM |
33 | |
34 | #endif /* assert.h */ | |
35 | ||
36 | #define _ASSERT_H 1 | |
37 | #include <features.h> | |
38 | ||
fd205052 UD |
39 | #if defined __cplusplus && __GNUC_PREREQ (2,95) |
40 | # define __ASSERT_VOID_CAST static_cast<void> | |
41 | #else | |
42 | # define __ASSERT_VOID_CAST (void) | |
43 | #endif | |
44 | ||
28f540f4 RM |
45 | /* void assert (int expression); |
46 | ||
47 | If NDEBUG is defined, do nothing. | |
48 | If not, and EXPRESSION is zero, print an error message and abort. */ | |
49 | ||
50 | #ifdef NDEBUG | |
51 | ||
fd205052 | 52 | # define assert(expr) (__ASSERT_VOID_CAST (0)) |
28f540f4 RM |
53 | |
54 | /* void assert_perror (int errnum); | |
55 | ||
56 | If NDEBUG is defined, do nothing. If not, and ERRNUM is not zero, print an | |
57 | error message with the error text for ERRNUM and abort. | |
58 | (This is a GNU extension.) */ | |
59 | ||
f21acc89 | 60 | # ifdef __USE_GNU |
fd205052 | 61 | # define assert_perror(errnum) (__ASSERT_VOID_CAST (0)) |
f21acc89 | 62 | # endif |
28f540f4 RM |
63 | |
64 | #else /* Not NDEBUG. */ | |
65 | ||
28f540f4 RM |
66 | __BEGIN_DECLS |
67 | ||
68 | /* This prints an "Assertion failed" message and aborts. */ | |
a784e502 UD |
69 | extern void __assert_fail (const char *__assertion, const char *__file, |
70 | unsigned int __line, const char *__function) | |
c1422e5b | 71 | __THROW __attribute__ ((__noreturn__)); |
28f540f4 RM |
72 | |
73 | /* Likewise, but prints the error text for ERRNUM. */ | |
a784e502 UD |
74 | extern void __assert_perror_fail (int __errnum, const char *__file, |
75 | unsigned int __line, const char *__function) | |
c1422e5b | 76 | __THROW __attribute__ ((__noreturn__)); |
28f540f4 | 77 | |
8fb81470 UD |
78 | |
79 | /* The following is not at all used here but needed for standard | |
80 | compliance. */ | |
81 | extern void __assert (const char *__assertion, const char *__file, int __line) | |
82 | __THROW __attribute__ ((__noreturn__)); | |
83 | ||
84 | ||
28f540f4 RM |
85 | __END_DECLS |
86 | ||
389935d7 UD |
87 | # define assert(expr) \ |
88 | ((expr) \ | |
89 | ? __ASSERT_VOID_CAST (0) \ | |
b3715c05 | 90 | : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION)) |
28f540f4 | 91 | |
f21acc89 | 92 | # ifdef __USE_GNU |
389935d7 UD |
93 | # define assert_perror(errnum) \ |
94 | (!(errnum) \ | |
95 | ? __ASSERT_VOID_CAST (0) \ | |
b3715c05 | 96 | : __assert_perror_fail ((errnum), __FILE__, __LINE__, __ASSERT_FUNCTION)) |
f21acc89 | 97 | # endif |
28f540f4 RM |
98 | |
99 | /* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__' | |
100 | which contains the name of the function currently being defined. | |
05cc5bd9 UD |
101 | This is broken in G++ before version 2.6. |
102 | C9x has a similar variable called __func__, but prefer the GCC one since | |
103 | it demangles C++ function names. */ | |
d0db5f48 | 104 | # if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4) |
05cc5bd9 | 105 | # define __ASSERT_FUNCTION __PRETTY_FUNCTION__ |
05cc5bd9 UD |
106 | # else |
107 | # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L | |
108 | # define __ASSERT_FUNCTION __func__ | |
109 | # else | |
a784e502 | 110 | # define __ASSERT_FUNCTION ((const char *) 0) |
05cc5bd9 | 111 | # endif |
f21acc89 | 112 | # endif |
28f540f4 | 113 | |
28f540f4 | 114 | #endif /* NDEBUG. */ |
839e283e UD |
115 | |
116 | ||
8ecd6b2a | 117 | #if defined __USE_ISOC11 && !defined __cplusplus |
839e283e UD |
118 | /* Static assertion. Requires support in the compiler. */ |
119 | # undef static_assert | |
120 | # define static_assert _Static_assert | |
121 | #endif |