1 /* Copyright (C) 1991-2015 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 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 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, see 16 <http://www.gnu.org/licenses/>. */ 17 18 /* 19 * ISO C99 Standard: 7.2 Diagnostics <assert.h> 20 */ 21 22 #ifdef _ASSERT_H 23 24 # undef _ASSERT_H 25 # undef assert 26 # undef __ASSERT_VOID_CAST 27 28 # ifdef __USE_GNU 29 # undef assert_perror 30 # endif 31 32 #endif /* assert.h */ 33 34 #define _ASSERT_H 1 35 #include <features.h> 36 37 #if defined __cplusplus && __GNUC_PREREQ (2,95) 38 # define __ASSERT_VOID_CAST static_cast<void> 39 #else 40 # define __ASSERT_VOID_CAST (void) 41 #endif 42 43 /* void assert (int expression); 44 45 If NDEBUG is defined, do nothing. 46 If not, and EXPRESSION is zero, print an error message and abort. */ 47 48 #ifdef NDEBUG 49 50 # define assert(expr) (__ASSERT_VOID_CAST (0)) 51 52 /* void assert_perror (int errnum); 53 54 If NDEBUG is defined, do nothing. If not, and ERRNUM is not zero, print an 55 error message with the error text for ERRNUM and abort. 56 (This is a GNU extension.) */ 57 58 # ifdef __USE_GNU 59 # define assert_perror(errnum) (__ASSERT_VOID_CAST (0)) 60 # endif 61 62 #else /* Not NDEBUG. */ 63 64 __BEGIN_DECLS 65 66 /* This prints an "Assertion failed" message and aborts. */ 67 extern void __assert_fail (const char *__assertion, const char *__file, 68 unsigned int __line, const char *__function) 69 __THROW __attribute__ ((__noreturn__)); 70 71 /* Likewise, but prints the error text for ERRNUM. */ 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 82 83 __END_DECLS 84 85 # define assert(expr) \ 86 ((expr) \ 87 ? __ASSERT_VOID_CAST (0) \ 88 : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION)) 89 90 # ifdef __USE_GNU 91 # define assert_perror(errnum) \ 92 (!(errnum) \ 93 ? __ASSERT_VOID_CAST (0) \ 94 : __assert_perror_fail ((errnum), __FILE__, __LINE__, __ASSERT_FUNCTION)) 95 # endif 96 97 /* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__' 98 which contains the name of the function currently being defined. 99 This is broken in G++ before version 2.6. 100 C9x has a similar variable called __func__, but prefer the GCC one since 101 it demangles C++ function names. */ 102 # if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4) 103 # define __ASSERT_FUNCTION __PRETTY_FUNCTION__ 104 # else 105 # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L 106 # define __ASSERT_FUNCTION __func__ 107 # else 108 # define __ASSERT_FUNCTION ((const char *) 0) 109 # endif 110 # endif 111 112 #endif /* NDEBUG. */ 113 114 115 #if defined __USE_ISOC11 && !defined __cplusplus 116 # undef static_assert 117 # define static_assert _Static_assert 118 #endif 119