Update copyright dates with scripts/update-copyrights.
[platform/upstream/glibc.git] / assert / assert.h
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 /* Static assertion.  Requires support in the compiler.  */
117 # undef static_assert
118 # define static_assert _Static_assert
119 #endif