opr: Disable some warnings during opr assertions 52/11852/5
authorChas Williams <3chas3@gmail.com>
Sat, 25 Apr 2015 20:38:12 +0000 (16:38 -0400)
committerBenjamin Kaduk <kaduk@mit.edu>
Mon, 25 Jan 2016 03:46:56 +0000 (22:46 -0500)
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 <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

acinclude.m4
src/cf/c-pragma.m4 [new file with mode: 0644]
src/opr/opr.h

index fdd5554..f8a0e23 100644 (file)
@@ -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 (file)
index 0000000..15e8c04
--- /dev/null
@@ -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
+])
index b2cd7d6..a6aaaf2 100644 (file)
@@ -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