+2020-05-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ assure: new macro ‘affirm’
+ * lib/assure.h: Include verify.h.
+ (affirm): New macro, after a suggestion by Marc Nieper-Wißkirchen in:
+ https://lists.gnu.org/r/bug-gnulib/2020-05/msg00263.html
+ and commentary by Bruno Haible in:
+ https://lists.gnu.org/r/bug-gnulib/2020-05/msg00278.html
+ * modules/assure (Depends-on:): Add verify.
+
2020-05-23 Bruno Haible <bruno@clisp.org>
calloc-gnu: Make test work in non-flat address spaces.
#define _GL_ASSURE_H
#include <assert.h>
+#include "verify.h"
+
+/* Evaluate an assertion E that is guaranteed to be true.
+ If NDEBUG is not defined, abort the program if E is false.
+ If NDEBUG is defined, the compiler can assume E and behavior is
+ undefined if E is false, fails to evaluate, or has side effects.
+
+ Unlike standard 'assert', this macro evaluates E even when NDEBUG
+ is defined, so as to catch typos, avoid some GCC warnings, and
+ improve performance when E is simple enough.
+
+ Also see the documentation for 'assume' in verify.h. */
+
+#ifdef NDEBUG
+# define affirm(E) assume (E)
+#else
+# define affirm(E) assert (E)
+#endif
/* Check E's value at runtime, and report an error and abort if not.
However, do nothing if NDEBUG is defined.
- Unlike standard 'assert', this macro always compiles E even when NDEBUG
- is defined, so as to catch typos and avoid some GCC warnings. */
+ Unlike standard 'assert', this macro compiles E even when NDEBUG
+ is defined, so as to catch typos and avoid some GCC warnings.
+ Unlike 'affirm', it is OK for E to use hard-to-optimize features,
+ since E is not executed if NDEBUG is defined. */
#ifdef NDEBUG
# define assure(E) ((void) (0 && (E)))