about summary refs log tree commit diff
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.gz
glibc-809b72df6c90303aa3622a28f2837ec6c518290d.tar.xz
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)