On Wed, Dec 18, 2024 at 2:37 PM David Malcolm <dmalc...@redhat.com> wrote:
>
> On Tue, 2024-11-26 at 16:35 -0500, Marek Polacek wrote:
> > On Mon, Nov 25, 2024 at 10:49:02PM -0500, David Malcolm wrote:
> > > This patch attempts to provide better error messages for
> > > code compiled with C23 that hasn't been updated for
> > > "bool", "true", and "false" becoming keywords (based on
> > > a brief review of the Gentoo bug tracker links given at
> > > https://gcc.gnu.org/pipermail/gcc/2024-November/245185.html).
> > >
> > > Specifically:
> > >
> > > (1) with "typedef int bool;" previously we emitted:
> > >
> > > t1.c:7:13: error: two or more data types in declaration specifiers
> > >     7 | typedef int bool;
> > >       |             ^~~~
> > > t1.c:7:1: warning: useless type name in empty declaration
> > >     7 | typedef int bool;
> > >       | ^~~~~~~
> > >
> > > whereas with this patch we emit:
> > >
> > > t1.c:7:13: error: 'bool' cannot be defined via 'typedef'
> > >     7 | typedef int bool;
> > >       |             ^~~~
> > > t1.c:7:13: note: 'bool' is a keyword with '-std=c23' onwards
> > > t1.c:7:1: warning: useless type name in empty declaration
> > >     7 | typedef int bool;
> > >       | ^~~~~~~
> > >
> > > (2) with "int bool;" previously we emitted:
> > >
> > > t2.c:7:5: error: two or more data types in declaration specifiers
> > >     7 | int bool;
> > >       |     ^~~~
> > > t2.c:7:1: warning: useless type name in empty declaration
> > >     7 | int bool;
> > >       | ^~~
> > >
> > > whereas with this patch we emit:
> > >
> > > t2.c:7:5: error: 'bool' cannot be used here
> > >     7 | int bool;
> > >       |     ^~~~
> > > t2.c:7:5: note: 'bool' is a keyword with '-std=c23' onwards
> > > t2.c:7:1: warning: useless type name in empty declaration
> > >     7 | int bool;
> > >       | ^~~
> > >
> > > (3) with "typedef enum { false = 0, true = 1 } _Bool;" previously
> > > we
> > > emitted:
> > >
> > > t3.c:7:16: error: expected identifier before 'false'
> > >     7 | typedef enum { false = 0, true = 1 } _Bool;
> > >       |                ^~~~~
> > > t3.c:7:38: error: expected ';', identifier or '(' before '_Bool'
> > >     7 | typedef enum { false = 0, true = 1 } _Bool;
> > >       |                                      ^~~~~
> > > t3.c:7:38: warning: useless type name in empty declaration
> > >
> > > whereas with this patch we emit:
> > >
> > > t3.c:7:16: error: cannot use keyword 'false' as enumeration
> > > constant
> > >     7 | typedef enum { false = 0, true = 1 } _Bool;
> > >       |                ^~~~~
> > > t3.c:7:16: note: 'false' is a keyword with '-std=c23' onwards
> > > t3.c:7:38: error: expected ';', identifier or '(' before '_Bool'
> > >     7 | typedef enum { false = 0, true = 1 } _Bool;
> > >       |                                      ^~~~~
> > > t3.c:7:38: warning: useless type name in empty declaration
> > >
> > >
> > > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
> > > OK for trunk?
> >
> > Thanks for the patch.
> >
> > For:
> >
> >   typedef int _Bool;
> >
> > or
> >
> >   int _Bool;
> >
> > this patch says:
> >
> >   note: '_Bool' is a keyword with '-std=c23' onwards
> >
> > but I don't think that's true: _Bool was added in C99 and is
> > obsolescent in
> > C23.
>
> Is _Bool meant to be usable in c90?


Yes. Since `_Bool` in the implementation reserved namespace (single
underscore followed by a capital letter), it can be done even for C90.
_Complex is in the same boat as _Bool here too but are in the
implementation reserved namespaces.  This is different from complex
and bool, etc.
We do have a -pedantic warning/error for its usage though.

Thanks,
Andrew

>
> I tried with -std=c90 and it fails; see:
> https://godbolt.org/z/Wf6a9EKP9
>
> <source>:1:13: error: two or more data types in declaration specifiers
>     1 | typedef int _Bool;
>       |             ^~~~~
> <source>:1:1: warning: useless type name in empty declaration
>     1 | typedef int _Bool;
>       | ^~~~~~~
>
> Thanks
> Dave
>

Reply via email to