diff --git a/lib/assure.h b/lib/assure.h index 8ea2f6e48..2f1326027 100644 --- a/lib/assure.h +++ b/lib/assure.h @@ -22,11 +22,29 @@ #include +/* Check E's value at runtime, and report an error and abort if not. + However, do nothing if NDEBUG is defined; in this case behavior is + undefined if E is false, fails to evaluate, or has side effects. + + Unlike standard 'assert', this macro always compiles 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. */ + 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: