Hi!

My r16-3059 PR120778 change which introduced the -Wkeyword-macro option
and made it a default for C++26 -pedantic broke quite a few tests on
powerpc*.  The problem is that the backend predefines bool and _Bool as
macros (unclear why _Bool for C++ because in C++ _Bool is not a keyword)
to make it a NODE_CONDITIONAL macro, so for e.g. -std=c++26 -pedantic-errors
we diagnose it on every TU as an error.
C++26 says that
#define bool anything
or
#undef bool
is invalid, diagnostic required (but in order not to break too much stuff
in the wild, we do it only if -pedantic or when user asks for it with
-Wkeyword-macro).  When the backend predefines it, there is no way user
can avoid that diagnostics and the backend ensures it will DTRT.
Fixed by temporarily disabling the NODE_WARN flag on those, so that the
warnings or errors aren't reported when the backend predefines the macro.
#undef bool
later on by users or redefines to something else will be still diagnosed.

Bootstrapped/regtested on powerpc64le-linux, ok for trunk?

2025-08-13  Jakub Jelinek  <ja...@redhat.com>

        PR target/121520
        * config/rs6000/rs6000-c.cc (rs6000_cpu_cpp_builtins): Temporarily
        clear NODE_WARN flag on "bool" or "_Bool" around builtin_define
        of those keywords if warn_keyword_macro.

--- gcc/config/rs6000/rs6000-c.cc.jj    2025-04-08 14:08:49.819301801 +0200
+++ gcc/config/rs6000/rs6000-c.cc       2025-08-13 09:00:07.115878529 +0200
@@ -636,8 +636,30 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfi
        {
          builtin_define ("vector=vector");
          builtin_define ("pixel=pixel");
-         builtin_define ("bool=bool");
-         builtin_define ("_Bool=_Bool");
+         if (warn_keyword_macro)
+           {
+             cpp_lookup (parse_in,
+                         (const unsigned char *) "bool",
+                         sizeof ("bool") - 1)->flags &= ~NODE_WARN;
+             builtin_define ("bool=bool");
+             cpp_lookup (parse_in,
+                         (const unsigned char *) "bool",
+                         sizeof ("bool") - 1)->flags |= NODE_WARN;
+           }
+         else
+           builtin_define ("bool=bool");
+         if (warn_keyword_macro && !c_dialect_cxx ())
+           {
+             cpp_lookup (parse_in,
+                         (const unsigned char *) "_Bool",
+                         sizeof ("_Bool") - 1)->flags &= ~NODE_WARN;
+             builtin_define ("_Bool=_Bool");
+             cpp_lookup (parse_in,
+                         (const unsigned char *) "_Bool",
+                         sizeof ("_Bool") - 1)->flags |= NODE_WARN;
+           }
+         else
+           builtin_define ("_Bool=_Bool");
          init_vector_keywords ();
 
          /* Enable context-sensitive macros.  */

        Jakub

Reply via email to