aboutsummaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2016-11-14 08:34:59 -0500
committerZack Weinberg <zackw@panix.com>2016-11-14 08:34:59 -0500
commit809b72df6c90303aa3622a28f2837ec6c518290d (patch)
treeb3c7546831817355514ffd37d522acc43f6899b2 /misc
parent14f95a420313ee745b80fe71a0fe6f61b46b327c (diff)
downloadglibc-809b72df6c90303aa3622a28f2837ec6c518290d.tar
glibc-809b72df6c90303aa3622a28f2837ec6c518290d.tar.gz
glibc-809b72df6c90303aa3622a28f2837ec6c518290d.tar.bz2
glibc-809b72df6c90303aa3622a28f2837ec6c518290d.zip
[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.
Diffstat (limited to 'misc')
-rw-r--r--misc/sys/cdefs.h7
-rw-r--r--misc/sys/sysmacros.h56
2 files changed, 28 insertions, 35 deletions
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 <bits/types.h>
#include <bits/sysmacros.h>
-/* 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 <sys/sysmacros.h>." \
- "\n For historical compatibility, it is currently defined by" \
- "\n <sys/types.h> as well, but we plan to remove this soon." \
- "\n To use `" #symbol "', include <sys/sysmacros.h> directly." \
- "\n If you did not intend to use a system-defined macro `" #symbol "'," \
- "\n you should #undef it after including <sys/types.h>." \
- "\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 <sys/sysmacros.h>. For historical compatibility, it is\n\
+ currently defined by <sys/types.h> as well, but we plan to\n\
+ remove this soon. To use #symbol, include <sys/sysmacros.h>\n\
+ directly. If you did not intend to use a system-defined macro\n\
+ #symbol, you should undefine it after including <sys/types.h>.)
+
+/* 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)