vec: Silence -Wunused-function warnings on clang
authorSimon Marchi <simon.marchi@ericsson.com>
Mon, 26 Jun 2017 13:08:35 +0000 (15:08 +0200)
committerSimon Marchi <simon.marchi@ericsson.com>
Mon, 26 Jun 2017 14:51:17 +0000 (16:51 +0200)
clang has a too aggressive (or broken, depends on how you want to see
it) -Wunused-function warning, which is triggered by the functions
defined by DEF_VEC_* but not used in the current source file.  Normally,
it won't warn about unused static inline functions defined in header
files, because it's expected that a source file won't use all functions
defined in a header file it includes.  However, if the DEF_VEC_* macro
is used in a source file, it considers those functions as defined in the
source file, which leads it to think that we should remove those
functions.  It is therefore missing a check to see whether those
functions are resulting from macro expansion.  A bug already exists for
that:

  https://bugs.llvm.org//show_bug.cgi?id=22712

It's quite easy to silence this warning in a localized way, that is in
the DEF_VEC_* macros.

gdb/ChangeLog:

* common/diagnostics.h: Define macros for GCC.
(DIAGNOSTIC_IGNORE_UNUSED_FUNCTION): New macro.
* common/vec.h: Include diagnostics.h.
(DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION): New macro.
(DEF_VEC_I, DEF_VEC_P, DEF_VEC_O): Ignore -Wunused-function
warning.

gdb/ChangeLog
gdb/common/diagnostics.h
gdb/common/vec.h

index 5b04862..e817dc7 100644 (file)
@@ -1,5 +1,14 @@
 2017-06-26  Simon Marchi  <simon.marchi@ericsson.com>
 
+       * common/diagnostics.h: Define macros for GCC.
+       (DIAGNOSTIC_IGNORE_UNUSED_FUNCTION): New macro.
+       * common/vec.h: Include diagnostics.h.
+       (DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION): New macro.
+       (DEF_VEC_I, DEF_VEC_P, DEF_VEC_O): Ignore -Wunused-function
+       warning.
+
+2017-06-26  Simon Marchi  <simon.marchi@ericsson.com>
+
        * common/diagnostics.h (DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER):
        New macro.
        * ada-lex.l: Ignore deprecated register warnings.
index 35bacf2..d6ab698 100644 (file)
 # define DIAGNOSTIC_IGNORE(option)
 #endif
 
-#ifdef __clang__
+#if defined (__clang__) /* clang */
+
 # define DIAGNOSTIC_IGNORE_SELF_MOVE DIAGNOSTIC_IGNORE ("-Wself-move")
 # define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER \
   DIAGNOSTIC_IGNORE ("-Wdeprecated-register")
-#else
+# define DIAGNOSTIC_IGNORE_UNUSED_FUNCTION \
+  DIAGNOSTIC_IGNORE ("-Wunused-function")
+
+#elif defined (__GNUC__) /* GCC */
+
+# define DIAGNOSTIC_IGNORE_SELF_MOVE
+# define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER
+# define DIAGNOSTIC_IGNORE_UNUSED_FUNCTION \
+  DIAGNOSTIC_IGNORE ("-Wunused-function")
+
+#else /* Other compilers */
+
 # define DIAGNOSTIC_IGNORE_SELF_MOVE
 # define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER
+# define DIAGNOSTIC_IGNORE_UNUSED_FUNCTION
 #endif
 
 #endif /* COMMON_DIAGNOSTICS_H */
index 982f771..98d4576 100644 (file)
 #if !defined (GDB_VEC_H)
 #define GDB_VEC_H
 
+#include "diagnostics.h"
+
+/* clang has a bug that makes it warn (-Wunused-function) about unused functions
+   that are the result of the DEF_VEC_* macro expansion.  See:
+
+     https://bugs.llvm.org/show_bug.cgi?id=22712
+
+   We specifically ignore this warning for the vec functions when the compiler
+   is clang.  */
+#ifdef __clang__
+# define DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION \
+    DIAGNOSTIC_IGNORE_UNUSED_FUNCTION
+#else
+# define DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION
+#endif
+
 /* The macros here implement a set of templated vector types and
    associated interfaces.  These templates are implemented with
    macros, as we're not in C++ land.  The interface functions are
@@ -408,6 +424,8 @@ typedef struct VEC(T)                                                         \
 
 /* Vector of integer-like object.  */
 #define DEF_VEC_I(T)                                                     \
+DIAGNOSTIC_PUSH                                                          \
+DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION                                    \
 static inline void VEC_OP (T,must_be_integral_type) (void)               \
 {                                                                        \
   (void)~(T)0;                                                           \
@@ -416,10 +434,13 @@ static inline void VEC_OP (T,must_be_integral_type) (void)                  \
 VEC_T(T);                                                                \
 DEF_VEC_FUNC_P(T)                                                        \
 DEF_VEC_ALLOC_FUNC_I(T)                                                          \
+DIAGNOSTIC_POP                                                           \
 struct vec_swallow_trailing_semi
 
 /* Vector of pointer to object.  */
 #define DEF_VEC_P(T)                                                     \
+DIAGNOSTIC_PUSH                                                          \
+DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION                                    \
 static inline void VEC_OP (T,must_be_pointer_type) (void)                \
 {                                                                        \
   (void)((T)1 == (void *)1);                                             \
@@ -428,13 +449,17 @@ static inline void VEC_OP (T,must_be_pointer_type) (void)           \
 VEC_T(T);                                                                \
 DEF_VEC_FUNC_P(T)                                                        \
 DEF_VEC_ALLOC_FUNC_P(T)                                                          \
+DIAGNOSTIC_POP                                                           \
 struct vec_swallow_trailing_semi
 
 /* Vector of object.  */
 #define DEF_VEC_O(T)                                                     \
+DIAGNOSTIC_PUSH                                                          \
+DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION                                    \
 VEC_T(T);                                                                \
 DEF_VEC_FUNC_O(T)                                                        \
 DEF_VEC_ALLOC_FUNC_O(T)                                                          \
+DIAGNOSTIC_POP                                                           \
 struct vec_swallow_trailing_semi
 
 /* Avoid offsetof (or its usual C implementation) as it triggers