]> git.ipfire.org Git - thirdparty/gcc.git/commit
c: special-case some "bool" errors with C23 (v2) [PR117629]
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 2 Jan 2025 20:10:15 +0000 (15:10 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Thu, 2 Jan 2025 20:10:15 +0000 (15:10 -0500)
commit321983033d621e3f75e11d380c4463956a3f6e1e
treef4ed1961d8858dbf05bad2e3cb4111f9a73e941a
parent99d5ef700619c28904846399a6f6692af4c56b1b
c: special-case some "bool" errors with C23 (v2) [PR117629]

Changed in v2:
- distinguish between "bool" and "_Bool" when determining
  standard version

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.

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

gcc/c/ChangeLog:
PR c/117629
* c-decl.cc (declspecs_add_type): Special-case attempts to use
bool as a typedef name or declaration name.
* c-errors.cc (get_std_for_keyword): New.
(add_note_about_new_keyword): New.
* c-parser.cc (report_bad_enum_name): New, split out from...
(c_parser_enum_specifier): ...here, adding handling for RID_FALSE
and RID_TRUE.
* c-tree.h (add_note_about_new_keyword): New decl.

gcc/testsuite/ChangeLog:
PR c/117629
* gcc.dg/auto-type-2.c: Update expected output with _Bool.
* gcc.dg/c23-bool-errors-1.c: New test.
* gcc.dg/c23-bool-errors-2.c: New test.
* gcc.dg/c23-bool-errors-3.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
gcc/c/c-decl.cc
gcc/c/c-errors.cc
gcc/c/c-parser.cc
gcc/c/c-tree.h
gcc/testsuite/gcc.dg/auto-type-2.c
gcc/testsuite/gcc.dg/c23-bool-errors-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c23-bool-errors-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c23-bool-errors-3.c [new file with mode: 0644]