]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - assert/assert.h
Fix http: URL in 'configure'
[thirdparty/glibc.git] / assert / assert.h
index 1bb9b2d50f92da3b17cc0b937ecd6141a87dc196..06b4faf4f1eeffc8883b39b70a75bae86b18eb7f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2013 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -13,7 +13,7 @@
 
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
+   <https://www.gnu.org/licenses/>.  */
 
 /*
  *     ISO C99 Standard: 7.2 Diagnostics       <assert.h>
@@ -82,10 +82,33 @@ extern void __assert (const char *__assertion, const char *__file, int __line)
 
 __END_DECLS
 
-# define assert(expr)                                                  \
-  ((expr)                                                              \
-   ? __ASSERT_VOID_CAST (0)                                            \
-   : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION))
+/* When possible, define assert so that it does not add extra
+   parentheses around EXPR.  Otherwise, those added parentheses would
+   suppress warnings we'd expect to be detected by gcc's -Wparentheses.  */
+# if defined __cplusplus
+#  define assert(expr)                                                 \
+     (static_cast <bool> (expr)                                                \
+      ? void (0)                                                       \
+      : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
+# elif !defined __GNUC__ || defined __STRICT_ANSI__
+#  define assert(expr)                                                 \
+    ((expr)                                                            \
+     ? __ASSERT_VOID_CAST (0)                                          \
+     : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
+# else
+/* The first occurrence of EXPR is not evaluated due to the sizeof,
+   but will trigger any pedantic warnings masked by the __extension__
+   for the second occurrence.  The ternary operator is required to
+   support function pointers and bit fields in this context, and to
+   suppress the evaluation of variable length arrays.  */
+#  define assert(expr)                                                 \
+  ((void) sizeof ((expr) ? 1 : 0), __extension__ ({                    \
+      if (expr)                                                                \
+        ; /* empty */                                                  \
+      else                                                             \
+        __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION);  \
+    }))
+# endif
 
 # ifdef        __USE_GNU
 #  define assert_perror(errnum)                                                \
@@ -100,7 +123,7 @@ __END_DECLS
    C9x has a similar variable called __func__, but prefer the GCC one since
    it demangles C++ function names.  */
 # if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)
-#   define __ASSERT_FUNCTION   __PRETTY_FUNCTION__
+#   define __ASSERT_FUNCTION   __extension__ __PRETTY_FUNCTION__
 # else
 #  if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
 #   define __ASSERT_FUNCTION   __func__
@@ -113,7 +136,6 @@ __END_DECLS
 
 
 #if defined __USE_ISOC11 && !defined __cplusplus
-/* Static assertion.  Requires support in the compiler.  */
 # undef static_assert
 # define static_assert _Static_assert
 #endif