From 809b72df6c90303aa3622a28f2837ec6c518290d Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Mon, 14 Nov 2016 08:34:59 -0500 Subject: [PATCH] [BZ #19239] Issue deprecation warnings on macro expansion. By using __glibc_macro_warning instead of __attribute_deprecated__, we get the deprecation warnings whenever the macros are expanded, not just when they compile to a function call. This is important for unintentional uses like the test case in #19239 (C++ var(value) initialization syntax, with a variable named "major"). It's also simpler, because __REDIRECT is no longer required. * misc/sys/sysmacros.h (__SYSMACROS_DM, __SYSMACROS_DM1): New macros. (__SYSMACROS_DEPRECATION_MSG, __SYSMACROS_FST_DECL_TEMPL) (__SYSMACROS_FST_IMPL_TEMPL): Delete. (major, minor, makedev): Use __SYSMACROS_DM in definition, instead of redirected function names. * misc/sys/cdefs.h (__glibc_macro_warning): Activate for clang >= 3.5 as well. Document that MESSAGE must be a single string literal. --- ChangeLog | 11 +++++++++ misc/sys/cdefs.h | 7 ++++-- misc/sys/sysmacros.h | 56 ++++++++++++++++++-------------------------- 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7521477dab..f2b6683003 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2016-11-14 Zack Weinberg + + * misc/sys/sysmacros.h (__SYSMACROS_DM, __SYSMACROS_DM1): New macros. + (__SYSMACROS_DEPRECATION_MSG, __SYSMACROS_FST_DECL_TEMPL) + (__SYSMACROS_FST_IMPL_TEMPL): Delete. + (major, minor, makedev): Use __SYSMACROS_DM in definition, instead + of redirected function names. + + * misc/sys/cdefs.h (__glibc_macro_warning): Activate for clang >= 3.5 + as well. Document that MESSAGE must be a single string literal. + 2016-11-11 Joseph Myers * scripts/build-many-glibcs.py: New file. diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index 50e00e6711..9298dd60f9 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -473,8 +473,11 @@ #endif /* __glibc_macro_warning (MESSAGE) issues warning MESSAGE. This is - intended for use in preprocessor macros. */ -#if __GNUC_PREREQ (4,8) + intended for use in preprocessor macros. + + Note: MESSAGE must be a _single_ string; concatenation of string + literals is not supported. */ +#if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5) # define __glibc_macro_warning1(message) _Pragma (#message) # define __glibc_macro_warning(message) \ __glibc_macro_warning1 (GCC warning message) diff --git a/misc/sys/sysmacros.h b/misc/sys/sysmacros.h index 086e9af5aa..7ecccfbf6d 100644 --- a/misc/sys/sysmacros.h +++ b/misc/sys/sysmacros.h @@ -40,54 +40,46 @@ #include #include -/* The extra "\n " moves gcc's [-Wdeprecated-declarations] annotation - onto the next line. */ -#define __SYSMACROS_DEPRECATION_MSG(symbol) \ - "\n In the GNU C Library, `" #symbol "' is defined by ." \ - "\n For historical compatibility, it is currently defined by" \ - "\n as well, but we plan to remove this soon." \ - "\n To use `" #symbol "', include directly." \ - "\n If you did not intend to use a system-defined macro `" #symbol "'," \ - "\n you should #undef it after including ." \ - "\n " +/* Caution: The text of this deprecation message is unquoted, so that + #symbol can be substituted. (It is converted to a string by + __SYSMACROS_DM1.) This means the message must be a sequence of + complete pp-tokens; in particular, English contractions (it's, + can't) cannot be used. + + The message has been manually word-wrapped to fit in 80 columns + when output by GCC 5 and 6. The first line is shorter to leave + some room for the "foo.c:23: warning:" annotation. */ +#define __SYSMACROS_DM(symbol) __SYSMACROS_DM1 \ + (In the GNU C Library, #symbol is defined\n\ + by . For historical compatibility, it is\n\ + currently defined by as well, but we plan to\n\ + remove this soon. To use #symbol, include \n\ + directly. If you did not intend to use a system-defined macro\n\ + #symbol, you should undefine it after including .) + +/* This macro is variadic because the deprecation message above + contains commas. */ +#define __SYSMACROS_DM1(...) __glibc_macro_warning (#__VA_ARGS__) #define __SYSMACROS_DECL_TEMPL(rtype, name, proto) \ extern rtype gnu_dev_##name proto __THROW __attribute_const__; -#define __SYSMACROS_FST_DECL_TEMPL(rtype, name, proto) \ - extern rtype __REDIRECT_NTH (__##name##_from_sys_types, proto, \ - gnu_dev_##name) \ - __attribute_const__ \ - __attribute_deprecated_msg__ (__SYSMACROS_DEPRECATION_MSG (name)); - #define __SYSMACROS_IMPL_TEMPL(rtype, name, proto) \ __extension__ __extern_inline __attribute_const__ rtype \ __NTH (gnu_dev_##name proto) -#define __SYSMACROS_FST_IMPL_TEMPL(rtype, name, proto) \ - __extension__ __extern_inline __attribute_const__ rtype \ - __NTH (__##name##_from_sys_types proto) - __BEGIN_DECLS __SYSMACROS_DECLARE_MAJOR (__SYSMACROS_DECL_TEMPL) __SYSMACROS_DECLARE_MINOR (__SYSMACROS_DECL_TEMPL) __SYSMACROS_DECLARE_MAKEDEV (__SYSMACROS_DECL_TEMPL) -__SYSMACROS_DECLARE_MAJOR (__SYSMACROS_FST_DECL_TEMPL) -__SYSMACROS_DECLARE_MINOR (__SYSMACROS_FST_DECL_TEMPL) -__SYSMACROS_DECLARE_MAKEDEV (__SYSMACROS_FST_DECL_TEMPL) - #ifdef __USE_EXTERN_INLINES __SYSMACROS_DEFINE_MAJOR (__SYSMACROS_IMPL_TEMPL) __SYSMACROS_DEFINE_MINOR (__SYSMACROS_IMPL_TEMPL) __SYSMACROS_DEFINE_MAKEDEV (__SYSMACROS_IMPL_TEMPL) -__SYSMACROS_DEFINE_MAJOR (__SYSMACROS_FST_IMPL_TEMPL) -__SYSMACROS_DEFINE_MINOR (__SYSMACROS_FST_IMPL_TEMPL) -__SYSMACROS_DEFINE_MAKEDEV (__SYSMACROS_FST_IMPL_TEMPL) - #endif __END_DECLS @@ -96,9 +88,7 @@ __END_DECLS #ifndef __SYSMACROS_NEED_IMPLEMENTATION # undef __SYSMACROS_DECL_TEMPL -# undef __SYSMACROS_FST_DECL_TEMPL # undef __SYSMACROS_IMPL_TEMPL -# undef __SYSMACROS_FST_IMPL_TEMPL # undef __SYSMACROS_DECLARE_MAJOR # undef __SYSMACROS_DECLARE_MINOR # undef __SYSMACROS_DECLARE_MAKEDEV @@ -108,9 +98,9 @@ __END_DECLS #endif #ifdef __SYSMACROS_DEPRECATED_INCLUSION -# define major(dev) __major_from_sys_types (dev) -# define minor(dev) __minor_from_sys_types (dev) -# define makedev(maj, min) __makedev_from_sys_types (maj, min) +# define major(dev) __SYSMACROS_DM (major) gnu_dev_major (dev) +# define minor(dev) __SYSMACROS_DM (minor) gnu_dev_minor (dev) +# define makedev(maj, min) __SYSMACROS_DM (makedev) gnu_dev_makedev (maj, min) #else # define major(dev) gnu_dev_major (dev) # define minor(dev) gnu_dev_minor (dev)