From 04661c4139b3f0bc7d44a43160c9a0ac1405ca5e Mon Sep 17 00:00:00 2001 From: Chas Williams <3chas3@gmail.com> Date: Sat, 25 Apr 2015 16:38:12 -0400 Subject: [PATCH] opr: Disable some warnings during opr assertions Detect _Pragma(), a C99 extension for inline #pragma's, and use it to disable to certain warnings during the use of opr_Verify() and opr_Assert(). Because some versions of clang support _Pragma, do not have support for -Wtautological-pointer-compare, and do set -Werror and -Wunknown-pragmas, we must explicitly check for pragma support for -Wtautological-pointer-compare as well. Change-Id: Id3d5ee347f320a366a0571572b58414aa7044bf7 Reviewed-on: http://gerrit.openafs.org/11852 Reviewed-by: Michael Meffie Reviewed-by: Benjamin Kaduk Tested-by: BuildBot --- acinclude.m4 | 1 + src/cf/c-pragma.m4 | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/opr/opr.h | 24 ++++++++++++++++++++++-- 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/cf/c-pragma.m4 diff --git a/acinclude.m4 b/acinclude.m4 index fdd5554..f8a0e23 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1621,6 +1621,7 @@ OPENAFS_ROKEN() OPENAFS_HCRYPTO() OPENAFS_CURSES() OPENAFS_C_ATTRIBUTE() +OPENAFS_C_PRAGMA() dnl Functions that Heimdal's libroken provides, but that we dnl haven't found a need for yet, and so haven't imported diff --git a/src/cf/c-pragma.m4 b/src/cf/c-pragma.m4 new file mode 100644 index 0000000..15e8c04 --- /dev/null +++ b/src/cf/c-pragma.m4 @@ -0,0 +1,46 @@ +dnl +dnl Test for _Pragma and how we need to use it +dnl +AC_DEFUN([OPENAFS_C_PRAGMA_TAUTOLOGICAL_POINTER_COMPARE],[ +AC_MSG_CHECKING(for _Pragma recognition of -Wtautological-pointer-compare) +AC_CACHE_VAL(ac_cv__Pragma_tautological_pointer_compare, [ +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +_Pragma("clang diagnostic error \"-Wunknown-pragmas\"") +_Pragma("clang diagnostic ignored \"-Wtautological-pointer-compare\"") + +void func(void) +{ + return; +} +]])], +[ac_cv__Pragma_tautological_pointer_compare=yes], +[ac_cv__Pragma_tautological_pointer_compare=no])]) +AC_MSG_RESULT($ac_cv__Pragma_tautological_pointer_compare) +]) + +AC_DEFUN([_OPENAFS_C_PRAGMA], [ +AC_MSG_CHECKING(for _Pragma) +AC_CACHE_VAL(ac_cv__Pragma, [ +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +_Pragma("") + +void func(void) +{ + return; +} +]])], +[ac_cv__Pragma=yes], +[ac_cv__Pragma=no])]) +AC_MSG_RESULT($ac_cv__Pragma)]) + +AC_DEFUN([OPENAFS_C_PRAGMA], [ +_OPENAFS_C_PRAGMA +if test "$ac_cv__Pragma" = "yes"; then + AC_DEFINE(HAVE__PRAGMA, 1, [define if your compiler has _Pragma]) + OPENAFS_C_PRAGMA_TAUTOLOGICAL_POINTER_COMPARE + if test "$ac_cv__Pragma_tautological_pointer_compare" = "yes"; then + AC_DEFINE(HAVE__PRAGMA_TAUTOLOGICAL_POINTER_COMPARE, 1, + [define if your compiler has _Pragma and recognizes -Wtautological-pointer-compare]) + fi +fi +]) diff --git a/src/opr/opr.h b/src/opr/opr.h index b2cd7d6..a6aaaf2 100644 --- a/src/opr/opr.h +++ b/src/opr/opr.h @@ -24,16 +24,36 @@ extern void opr_AssertFailU(const char *, const char *, int) AFS_NORETURN; * to a no-op if NDEBUG is defined */ -#define opr_Assert(ex) \ +#define __opr_Assert(ex) \ do {if (!(ex)) opr_AssertionFailed(__FILE__, __LINE__);} while(0) +#if defined(HAVE__PRAGMA_TAUTOLOGICAL_POINTER_COMPARE) && defined(__clang__) +# define opr_Assert(ex) \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wtautological-pointer-compare\"") \ + __opr_Assert(ex) \ + _Pragma("clang diagnostic pop") +#else +# define opr_Assert(ex) __opr_Assert(ex) +#endif + /* opr_Verify is an assertion function which is guaranteed to always * invoke its expression, regardless of the debugging level selected * at compile time */ -#define opr_Verify(ex) \ +#define __opr_Verify(ex) \ do {if (!(ex)) opr_AssertionFailed(__FILE__, __LINE__);} while(0) +#if defined(HAVE__PRAGMA_TAUTOLOGICAL_POINTER_COMPARE) && defined(__clang__) +# define opr_Verify(ex) \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wtautological-pointer-compare\"") \ + __opr_Verify(ex) \ + _Pragma("clang diagnostic pop") +#else +# define opr_Verify(ex) __opr_Verify(ex) +#endif + /* casestrcpy.c */ #define lcstring opr_lcstring #define ucstring opr_ucstring -- 1.9.4