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