This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: Last <sys/cdefs.h> change
- From: Corinna Vinschen <vinschen at redhat dot com>
- To: newlib at sourceware dot org
- Date: Thu, 23 May 2013 10:58:59 +0200
- Subject: Re: Last <sys/cdefs.h> change
- References: <519DC581 dot 20602 at embedded-brains dot de> <20130523074440 dot GA11512 at calimero dot vinschen dot de> <519DCD35 dot 3010709 at embedded-brains dot de>
- Reply-to: newlib at sourceware dot org
On May 23 10:03, Sebastian Huber wrote:
> On 05/23/2013 09:44 AM, Corinna Vinschen wrote:
> >On May 23 09:30, Sebastian Huber wrote:
> >>Hello,
> >>
> >>what is the reason for the change:
> >>[...]
> >>There is already a test for C11 some lines above:
> >>
> >>#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
> >>/* Do nothing. They are language keywords. */
> >>#else
> >>/* Not supported. Implement them using our versions. */
> >>
> >>If you want C11 in GCC, you have to specify -std=c11 or -std=gnu11.
> >
> >gcc >= 4.6 defines _Static_assert even without -std=C11.
> >
> >See http://cygwin.com/ml/cygwin/2013-05/msg00310.html
>
> In this message the problem occurs with "gcc -std=gnu99". Asking
> for a C11 feature with such a command line seems to be
> contradictory.
>
> I would use this approach:
>
> --- newlib/libc/include/sys/cdefs.h 2013-05-23 09:21:47.817952315 +0200
> +++ cdefs.h 2013-05-23 10:01:28.014875569 +0200
> @@ -261,15 +261,15 @@
> #define _Thread_local __thread
> #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
> /* Do nothing. They are language keywords. */
> +#elif !defined(__STDC_VERSION__) && __GNUC_PREREQ__(4, 6)
> +/* Do nothing. They are provided for free. */
Does that mean _Alignas, _Alignof, _Noreturn, and _Thread_local
are also defined since 4.6?
I don't quite grok the !defined(__STDC_VERSION__) here. gcc 4.6 defines
_Static_assert independently from the -std setting and independently
from -ansi. It's just there, always. The coreutils header assumes that
_Static_assert exists because it found that it's compiled with gcc 4.6
or later. It uses the _Static_assert in a way which works with the
builtin version of gcc. This collides with the definition of
_Static_assert in cdefs.h. Now, with your change, cdefs.h would fall
back to its own definition again if __STDC_VERSION__ is defined, thus
your change would break coreutils again.
Corinna
--
Corinna Vinschen
Cygwin Maintainer
Red Hat