Correct __GNUC_PREREQ for __const__ and __noreturn__ attributes.
Commit Message
Although GCC 2.5 introduced 'const' and 'noreturn' function
attributes, the '__const__' and '__noreturn__' were not available
until 2.6.2. So check __GNU_PREREQ(2,7) for these.
Note: I'm here only to correct an inaccurate info. Because I guess
very few people would use such an old compiler now, I'm not bothered to
test, nor add support for __attribute__((const)) just for it's sake.
* misc/sys/cdefs.h (__attribute_const__): Correct __GNUC_PREREQ
to (2,7).
(_Noreturn): Likewise.
Signed-off-by: Kang-Che Sung <explorer09@gmail.com>
---
ChangeLog | 6 ++++++
misc/sys/cdefs.h | 10 +++++++---
2 files changed, 13 insertions(+), 3 deletions(-)
Comments
On 03/20/2017 01:52 PM, Kang-Che Sung wrote:
> Although GCC 2.5 introduced 'const' and 'noreturn' function
> attributes, the '__const__' and '__noreturn__' were not available
> until 2.6.2. So check __GNU_PREREQ(2,7) for these.
>
> Note: I'm here only to correct an inaccurate info. Because I guess
> very few people would use such an old compiler now, I'm not bothered to
> test, nor add support for __attribute__((const)) just for it's sake.
Kang-Che,
So you did not test this change with a gcc-2.5 compiler?
> * misc/sys/cdefs.h (__attribute_const__): Correct __GNUC_PREREQ
> to (2,7).
> (_Noreturn): Likewise.
Jakub, Marek,
Are either of you able to verify the correctness of this for us?
Thanks.
> Signed-off-by: Kang-Che Sung <explorer09@gmail.com>
> ---
> ChangeLog | 6 ++++++
> misc/sys/cdefs.h | 10 +++++++---
> 2 files changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index 578714c4fb..e0ddc4497f 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,9 @@
> +2017-03-21 Kang-Che Sung <explorer09@gmail.com>
> +
> + * misc/sys/cdefs.h (__attribute_const__): Correct __GNUC_PREREQ
> + to (2,7).
> + (_Noreturn): Likewise.
> +
> 2017-03-20 Mike Frysinger <vapier@gentoo.org>
>
> [BZ #21275]
> diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
> index b03ebda22f..d040f72b70 100644
> --- a/misc/sys/cdefs.h
> +++ b/misc/sys/cdefs.h
> @@ -221,8 +221,10 @@
> # define __attribute_pure__ /* Ignore */
> #endif
>
> -/* This declaration tells the compiler that the value is constant. */
> -#if __GNUC_PREREQ (2,5)
> +/* This declaration tells the compiler that the value is constant.
> + Although `const' attribute was introduced in gcc 2.5, we need at least
> + gcc 2.6.2 for the `__const__' name. */
> +#if __GNUC_PREREQ (2,7)
> # define __attribute_const__ __attribute__ ((__const__))
> #else
> # define __attribute_const__ /* Ignore */
> @@ -398,7 +400,9 @@
> #if (!defined _Noreturn \
> && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
> && !__GNUC_PREREQ (4,7))
> -# if __GNUC_PREREQ (2,8)
> +/* Although `noreturn' attribute was introduced in gcc 2.5, we need at least
> + gcc 2.6.2 for the `__noreturn__' name. */
> +# if __GNUC_PREREQ (2,7)
> # define _Noreturn __attribute__ ((__noreturn__))
> # else
> # define _Noreturn
>
On Mon, 20 Mar 2017, Carlos O'Donell wrote:
> On 03/20/2017 01:52 PM, Kang-Che Sung wrote:
> > Although GCC 2.5 introduced 'const' and 'noreturn' function
> > attributes, the '__const__' and '__noreturn__' were not available
> > until 2.6.2. So check __GNU_PREREQ(2,7) for these.
> >
> > Note: I'm here only to correct an inaccurate info. Because I guess
> > very few people would use such an old compiler now, I'm not bothered to
> > test, nor add support for __attribute__((const)) just for it's sake.
>
> Kang-Che,
>
> So you did not test this change with a gcc-2.5 compiler?
It's not plausible to use glibc 2 with any compiler older than GCC 2.7
(glibc 2 support was only added for GNU/Linux in some 2.7.2.x point
release, ELF support for GNU/Linux was only added in 2.7, and I don't
think ELF support for Hurd was present earlier either).
On Tue, Mar 21, 2017 at 2:01 AM, Carlos O'Donell <carlos@redhat.com> wrote:
> On 03/20/2017 01:52 PM, Kang-Che Sung wrote:
>> Although GCC 2.5 introduced 'const' and 'noreturn' function
>> attributes, the '__const__' and '__noreturn__' were not available
>> until 2.6.2. So check __GNU_PREREQ(2,7) for these.
>>
>> Note: I'm here only to correct an inaccurate info. Because I guess
>> very few people would use such an old compiler now, I'm not bothered to
>> test, nor add support for __attribute__((const)) just for it's sake.
>
> Kang-Che,
>
> So you did not test this change with a gcc-2.5 compiler?
No, I only correct this based on the ONEWS entries in gcc package...
https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/ONEWS?view=markup
...and a ChangeLog entry dated 1994...
> Thu Nov 10 18:02:58 1994 Michael Meissner <meissner@pasta.osf.org>
> * c-common.c (decl_attributes): Check for attributes with leading
> and trailing double underscores.
...and a source diff of 2.6.2 proving that "__const__" is added here:
https://ftp.gnu.org/old-gnu/gcc/Version2.diffs/gcc-2.6.1-2.6.2.diff.gz
(By the way, this is my first time submitting a patch for glibc. So
excuse if I did something wrong)
For what it's worth, Gnulib code uses __attribute__ ((__noreturn__)) for GCC 2.8
and later, and __attribute__ ((__const__)) for GCC 2.95 and later. I vaguely
recall problems using these attributes in earlier GCC versions, though I'm
afraid I don't remember the details. Perhaps Glibc wouldn't run into the
problems, whatever they were.
On Tue, 21 Mar 2017, Paul Eggert wrote:
> For what it's worth, Gnulib code uses __attribute__ ((__noreturn__)) for GCC
> 2.8 and later, and __attribute__ ((__const__)) for GCC 2.95 and later. I
> vaguely recall problems using these attributes in earlier GCC versions, though
> I'm afraid I don't remember the details. Perhaps Glibc wouldn't run into the
> problems, whatever they were.
I think the 2.8 conditional may be in order to support it at the start of
a function declaration (before the return type), i.e. compatibly with
_Noreturn.
On Thu, Mar 23, 2017 at 1:32 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Tue, 21 Mar 2017, Paul Eggert wrote:
>
>> For what it's worth, Gnulib code uses __attribute__ ((__noreturn__)) for GCC
>> 2.8 and later, and __attribute__ ((__const__)) for GCC 2.95 and later. I
>> vaguely recall problems using these attributes in earlier GCC versions, though
>> I'm afraid I don't remember the details. Perhaps Glibc wouldn't run into the
>> problems, whatever they were.
>
> I think the 2.8 conditional may be in order to support it at the start of
> a function declaration (before the return type), i.e. compatibly with
> _Noreturn.
So I took some time and tested the __attribute__ syntax in gcc 2.7.2
(in the old Debian 1.1) and a custom-built gcc 2.8.0 (not fully
bootstrapped but enough to compile test code).
And yes you're correct; the prefix attribute syntax doesn't work until
2.8.0.
Thanks both Paul Eggert and Joseph Myers.
(By the way, should we add a comment about this info in the code?)
To be precise, this correctly parses in gcc-2.7.2 according to my testing:
void __attribute__((__noreturn__)) f(void) { exit(1); }
But this will not until gcc-2.8.0:
__attribute__((__noreturn__)) void f(void) { exit(1); }
Unfortunately the former way is not compatible with C11's _Noreturn syntax.
I mean I can't just "#define _Noreturn __attribute__((__noreturn__))" and
expect it work.
I guess that's it.
@@ -1,3 +1,9 @@
+2017-03-21 Kang-Che Sung <explorer09@gmail.com>
+
+ * misc/sys/cdefs.h (__attribute_const__): Correct __GNUC_PREREQ
+ to (2,7).
+ (_Noreturn): Likewise.
+
2017-03-20 Mike Frysinger <vapier@gentoo.org>
[BZ #21275]
@@ -221,8 +221,10 @@
# define __attribute_pure__ /* Ignore */
#endif
-/* This declaration tells the compiler that the value is constant. */
-#if __GNUC_PREREQ (2,5)
+/* This declaration tells the compiler that the value is constant.
+ Although `const' attribute was introduced in gcc 2.5, we need at least
+ gcc 2.6.2 for the `__const__' name. */
+#if __GNUC_PREREQ (2,7)
# define __attribute_const__ __attribute__ ((__const__))
#else
# define __attribute_const__ /* Ignore */
@@ -398,7 +400,9 @@
#if (!defined _Noreturn \
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
&& !__GNUC_PREREQ (4,7))
-# if __GNUC_PREREQ (2,8)
+/* Although `noreturn' attribute was introduced in gcc 2.5, we need at least
+ gcc 2.6.2 for the `__noreturn__' name. */
+# if __GNUC_PREREQ (2,7)
# define _Noreturn __attribute__ ((__noreturn__))
# else
# define _Noreturn