From: Paul Eggert Date: Mon, 12 Aug 2019 21:57:08 +0000 (-0700) Subject: verify: improve diagnostic quality in recent GCC X-Git-Tag: v1.0~4718 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=96443cc734f3486014b10f4351fc84cae17f9165;p=gnulib.git verify: improve diagnostic quality in recent GCC If ‘verify’ fails in a deeply-nested macro, GCC does not output a useful line number containing the top-level caller of the macro. So, bring back the older way of issuing a diagnostic containing the top-level call’s arg, so that it is easier to diagnose ‘verify’ failures with recent GCC. * lib/verify.h (_GL_VERIFY_TRUE, _GL_VERIFY_TYPE): Bring back DIAGNOSTIC arg. All callers changed. (verify): Just use _GL_VERIFY. --- diff --git a/ChangeLog b/ChangeLog index 8928bb230a..7e42765485 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2019-08-12 Paul Eggert + + verify: improve diagnostic quality in recent GCC + If ‘verify’ fails in a deeply-nested macro, GCC does not output a + useful line number containing the top-level caller of the macro. + So, bring back the older way of issuing a diagnostic containing + the top-level call’s arg, so that it is easier to diagnose + ‘verify’ failures with recent GCC. + * lib/verify.h (_GL_VERIFY_TRUE, _GL_VERIFY_TYPE): + Bring back DIAGNOSTIC arg. All callers changed. + (verify): Just use _GL_VERIFY. + 2019-08-11 Bruno Haible localcharset: Add more aliases for OS/2. diff --git a/lib/verify.h b/lib/verify.h index 9b8e1ed20f..afdc1ad81f 100644 --- a/lib/verify.h +++ b/lib/verify.h @@ -175,9 +175,11 @@ #define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER) /* Verify requirement R at compile-time, as an integer constant expression - that returns 1. If R is false, fail at compile-time. */ + that returns 1. If R is false, fail at compile-time, preferably + with a diagnostic that includes the string-literal DIAGNOSTIC. */ -#define _GL_VERIFY_TRUE(R) (!!sizeof (_GL_VERIFY_TYPE (R))) +#define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \ + (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC))) #ifdef __cplusplus # if !GNULIB_defined_struct__gl_verify_type @@ -187,15 +189,16 @@ template }; # define GNULIB_defined_struct__gl_verify_type 1 # endif -# define _GL_VERIFY_TYPE(R) _gl_verify_type<(R) ? 1 : -1> -#elif defined _GL_HAVE__STATIC_ASSERT1 -# define _GL_VERIFY_TYPE(R) \ +# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ + _gl_verify_type<(R) ? 1 : -1> +#elif defined _GL_HAVE__STATIC_ASSERT +# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ struct { \ - _Static_assert (R); \ + _Static_assert (R, DIAGNOSTIC); \ int _gl_dummy; \ } #else -# define _GL_VERIFY_TYPE(R) \ +# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; } #endif @@ -214,7 +217,7 @@ template #else # define _GL_VERIFY(R, DIAGNOSTIC, ...) \ extern int (*_GL_GENSYM (_gl_verify_function) (void)) \ - [_GL_VERIFY_TRUE (R)] + [_GL_VERIFY_TRUE (R, DIAGNOSTIC)] #endif /* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */ @@ -242,17 +245,19 @@ template /* Verify requirement R at compile-time. Return the value of the expression E. */ -#define verify_expr(R, E) (_GL_VERIFY_TRUE (R) ? (E) : (E)) +#define verify_expr(R, E) \ + (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E)) /* Verify requirement R at compile-time, as a declaration without a trailing ';'. verify (R) acts like static_assert (R) except that - it is portable to C11/C++14 and earlier, and its name is shorter - and may be more convenient. */ + it is portable to C11/C++14 and earlier, it can issue better + diagnostics, and its name is shorter and may be more convenient. */ -#ifdef _GL_HAVE__STATIC_ASSERT1 -# define verify(R) _Static_assert (R) -#else +#ifdef __PGI +/* PGI barfs if R is long. */ # define verify(R) _GL_VERIFY (R, "verify (...)", -) +#else +# define verify(R) _GL_VERIFY (R, "verify (" #R ")", -) #endif #ifndef __has_builtin