Linux: Fix __glibc_has_include use for <sys/stat.h> and statx

The identifier linux is used as a predefined macro, so the actually
used path is 1/stat.h or 1/stat64.h.  Using the quote-based version
triggers a file lookup for /usr/include/bits/linux/stat.h (or whatever
directory is used to store bits/statx.h), but since bits/ is pretty
much reserved by glibc, this appears to be acceptable.

This is related to GCC PR 80005: incorrect macro expansion of the
argument of __has_include.

Suggested by Zack Weinberg.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
Florian Weimer 2019-06-14 16:28:41 +02:00
parent 8d141877e0
commit 48c3c12389
2 changed files with 10 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2019-06-14 Florian Weimer <fweimer@redhat.com>
* sysdeps/unix/sysv/linux/bits/statx.h: Use string literal in
argument to __glibc_has_include to inhibit macro expansion.
2019-06-14 Florian Weimer <fweimer@redhat.com>
* misc/sys/cdefs.h (__glibc_has_include): Do not use a

View File

@ -23,8 +23,11 @@
#endif
/* Use the Linux kernel header if available. */
#if __glibc_has_include (<linux/stat.h>)
# include <linux/stat.h>
/* Use "" to work around incorrect macro expansion of the
__has_include argument (GCC PR 80005). */
#if __glibc_has_include ("linux/stat.h")
# include "linux/stat.h"
# ifdef STATX_TYPE
# define __statx_timestamp_defined 1
# define __statx_defined 1