vec: Silence -Wunused-function warnings on clang

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.
This commit is contained in:
Simon Marchi 2017-06-26 15:08:35 +02:00
parent d1435379df
commit 8b5a7a6e8c
3 changed files with 49 additions and 2 deletions

View File

@ -1,3 +1,12 @@
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):

View File

@ -31,13 +31,26 @@
# 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 */

View File

@ -20,6 +20,22 @@
#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