[PATCH 2/3] vec: Silence -Wunused-function warnings on clang

Simon Marchi
2017-06-25T17:45:56Z

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, the DEF_VEC_* macros
define those functions in source files, which leads clang 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 (DIAGNOSTIC_IGNORE_UNUSED_FUNCTION): New
macro.
* common/vec.h: Include diagnostics.h.
(DEF_VEC_I, DEF_VEC_P, DEF_VEC_O): Ignore -Wunused-function
warning.
---
gdb/common/diagnostics.h | 3 +++
gdb/common/vec.h | 11 +++++++++++
2 files changed, 14 insertions(+)

diff --git a/gdb/common/diagnostics.h b/gdb/common/diagnostics.h
index 35bacf2..ee824a3 100644
--- a/gdb/common/diagnostics.h
+++ b/gdb/common/diagnostics.h
@@ -35,9 +35,12 @@
# define DIAGNOSTIC_IGNORE_SELF_MOVE DIAGNOSTIC_IGNORE ("-Wself-move")
# define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER \
DIAGNOSTIC_IGNORE ("-Wdeprecated-register")
+# define DIAGNOSTIC_IGNORE_UNUSED_FUNCTION \
+ DIAGNOSTIC_IGNORE ("-Wunused-function")
#else
# define DIAGNOSTIC_IGNORE_SELF_MOVE
# define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER
+# define DIAGNOSTIC_IGNORE_UNUSED_FUNCTION
#endif

#endif /* COMMON_DIAGNOSTICS_H */
diff --git a/gdb/common/vec.h b/gdb/common/vec.h
index 982f771..0221c88 100644
--- a/gdb/common/vec.h
+++ b/gdb/common/vec.h
@@ -20,6 +20,8 @@
#if !defined (GDB_VEC_H)
#define GDB_VEC_H

+#include "diagnostics.h"
+
/* 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 +410,8 @@ typedef struct VEC(T) \

/* Vector of integer-like object. */
#define DEF_VEC_I(T) \
+DIAGNOSTIC_PUSH \
+DIAGNOSTIC_IGNORE_UNUSED_FUNCTION \
static inline void VEC_OP (T,must_be_integral_type) (void) \
{ \
(void)~(T)0; \
@@ -416,10 +420,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_FUNCTION \
static inline void VEC_OP (T,must_be_pointer_type) (void) \
{ \
(void)((T)1 == (void *)1); \
@@ -428,13 +435,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_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
--
2.7.4