>From 2df56dc44200074077ebace04079ac4b0a34e4fc Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 23 May 2020 19:06:16 -0700 Subject: [PATCH] =?UTF-8?q?assure:=20new=20macro=20=E2=80=98affirm?= =?UTF-8?q?=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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. --- ChangeLog | 10 ++++++++++ lib/assure.h | 24 ++++++++++++++++++++++-- modules/assure | 1 + 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a7101db80..c05ef910d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2020-05-23 Paul Eggert + + 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 calloc-gnu: Make test work in non-flat address spaces. diff --git a/lib/assure.h b/lib/assure.h index 8ea2f6e48..09a4edfa5 100644 --- a/lib/assure.h +++ b/lib/assure.h @@ -21,12 +21,32 @@ #define _GL_ASSURE_H #include +#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))) diff --git a/modules/assure b/modules/assure index 3cfe1f874..c37191717 100644 --- a/modules/assure +++ b/modules/assure @@ -5,6 +5,7 @@ Files: lib/assure.h Depends-on: +verify configure.ac: -- 2.17.1