From 7ea8ff37c427918bf5c5f674fa9f928cdb0bed9b Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 12 Aug 2020 02:24:04 +0200 Subject: [PATCH] Use __restrict also on clang. * lib/cdefs.h (__restrict): Don't define as a macro on clang. (__restrict_arr): On clang, define like on GCC. * lib/regex.h (_Restrict_): Use '__restrict' also on clang. (_Restrict_arr_): Use _Restrict_ also on clang. * lib/spawn.in.h (_Restrict_): Use '__restrict' also on clang. (_Restrict_arr_): Use _Restrict_ also on clang. --- ChangeLog | 10 ++++++++++ lib/cdefs.h | 11 +++++++---- lib/regex.h | 17 ++++++++++++----- lib/spawn.in.h | 17 ++++++++++++----- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index aced45e791..5c17b05cb2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2020-08-11 Bruno Haible + + Use __restrict also on clang. + * lib/cdefs.h (__restrict): Don't define as a macro on clang. + (__restrict_arr): On clang, define like on GCC. + * lib/regex.h (_Restrict_): Use '__restrict' also on clang. + (_Restrict_arr_): Use _Restrict_ also on clang. + * lib/spawn.in.h (_Restrict_): Use '__restrict' also on clang. + (_Restrict_arr_): Use _Restrict_ also on clang. + 2020-08-11 Bruno Haible Use flexible array syntax also on clang. diff --git a/lib/cdefs.h b/lib/cdefs.h index 4086d51b28..dfa935fc8d 100644 --- a/lib/cdefs.h +++ b/lib/cdefs.h @@ -399,8 +399,10 @@ # define __extension__ /* Ignore */ #endif -/* __restrict is known in EGCS 1.2 and above. */ -#if !__GNUC_PREREQ (2,92) +/* __restrict is known in EGCS 1.2 and above, and in clang. + It works also in C++ mode (outside of arrays), but only when spelled + as '__restrict', not 'restrict'. */ +#if !(__GNUC_PREREQ (2,92) || __clang_major__ >= 3) # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L # define __restrict restrict # else @@ -410,8 +412,9 @@ /* ISO C99 also allows to declare arrays as non-overlapping. The syntax is array_name[restrict] - GCC 3.1 supports this. */ -#if __GNUC_PREREQ (3,1) && !defined __GNUG__ + GCC 3.1 and clang support this. + This syntax is not usable in C++ mode. */ +#if (__GNUC_PREREQ (3,1) || __clang_major__ >= 3) && !defined __cplusplus # define __restrict_arr __restrict #else # ifdef __GNUC__ diff --git a/lib/regex.h b/lib/regex.h index 5fe41c8685..7418e6c76f 100644 --- a/lib/regex.h +++ b/lib/regex.h @@ -612,7 +612,9 @@ extern int re_exec (const char *); 'configure' might #define 'restrict' to those words, so pick a different name. */ #ifndef _Restrict_ -# if defined __restrict || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) +# if defined __restrict \ + || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \ + || __clang_major__ >= 3 # define _Restrict_ __restrict # elif 199901L <= __STDC_VERSION__ || defined restrict # define _Restrict_ restrict @@ -620,13 +622,18 @@ extern int re_exec (const char *); # define _Restrict_ # endif #endif -/* For [restrict], use glibc's __restrict_arr if available. - Otherwise, GCC 3.1 (not in C++ mode) and C99 support [restrict]. */ +/* For the ISO C99 syntax + array_name[restrict] + use glibc's __restrict_arr if available. + Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode). + Other ISO C99 compilers support it as well. */ #ifndef _Restrict_arr_ # ifdef __restrict_arr # define _Restrict_arr_ __restrict_arr -# elif ((199901L <= __STDC_VERSION__ || 3 < __GNUC__ + (1 <= __GNUC_MINOR__)) \ - && !defined __GNUG__) +# elif ((199901L <= __STDC_VERSION__ \ + || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \ + || __clang_major__ >= 3) \ + && !defined __cplusplus) # define _Restrict_arr_ _Restrict_ # else # define _Restrict_arr_ diff --git a/lib/spawn.in.h b/lib/spawn.in.h index c4dd01aa35..537fac7dbc 100644 --- a/lib/spawn.in.h +++ b/lib/spawn.in.h @@ -50,7 +50,9 @@ 'configure' might #define 'restrict' to those words, so pick a different name. */ #ifndef _Restrict_ -# if defined __restrict || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) +# if defined __restrict \ + || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \ + || __clang_major__ >= 3 # define _Restrict_ __restrict # elif 199901L <= __STDC_VERSION__ || defined restrict # define _Restrict_ restrict @@ -58,13 +60,18 @@ # define _Restrict_ # endif #endif -/* For [restrict], use glibc's __restrict_arr if available. - Otherwise, GCC 3.1 (not in C++ mode) and C99 support [restrict]. */ +/* For the ISO C99 syntax + array_name[restrict] + use glibc's __restrict_arr if available. + Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode). + Other ISO C99 compilers support it as well. */ #ifndef _Restrict_arr_ # ifdef __restrict_arr # define _Restrict_arr_ __restrict_arr -# elif ((199901L <= __STDC_VERSION__ || 3 < __GNUC__ + (1 <= __GNUC_MINOR__)) \ - && !defined __GNUG__) +# elif ((199901L <= __STDC_VERSION__ \ + || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \ + || __clang_major__ >= 3) \ + && !defined __cplusplus) # define _Restrict_arr_ _Restrict_ # else # define _Restrict_arr_ -- 2.39.5