https://gcc.gnu.org/g:611fc650502023dd43c71584e4c4d049da24e7a0

commit r16-5112-g611fc650502023dd43c71584e4c4d049da24e7a0
Author: Jakub Jelinek <[email protected]>
Date:   Mon Nov 10 11:34:20 2025 +0100

    c++, libcpp: Implement CWG3053
    
    The following patch implements CWG3053 approved in Kona, where it is now
    valid not just to #define likely(a) or #define unlikely(a, b, c) but also
    to #undef likely or #undef unlikely.
    
    2025-11-10  Jakub Jelinek  <[email protected]>
    
    libcpp/
            * directives.cc: Implement CWG3053.
            (do_undef): Don't pedwarn or warn about #undef likely or #undef
            unlikely.
    gcc/testsuite/
            * g++.dg/warn/Wkeyword-macro-4.C: Don't diagnose for #undef likely
            or #undef unlikely.
            * g++.dg/warn/Wkeyword-macro-5.C: Likewise.
            * g++.dg/warn/Wkeyword-macro-9.C: Likewise.
            * g++.dg/warn/Wkeyword-macro-8.C: Likewise.
            * g++.dg/warn/Wkeyword-macro-10.C: Likewise.

Diff:
---
 gcc/testsuite/g++.dg/warn/Wkeyword-macro-10.C |  4 ++--
 gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C  |  4 ++--
 gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C  |  4 ++--
 gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C  |  4 ++--
 gcc/testsuite/g++.dg/warn/Wkeyword-macro-9.C  |  2 +-
 libcpp/directives.cc                          | 11 ++++++++---
 6 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-10.C 
b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-10.C
index e6fafcd1a305..ec8c95ea63a7 100644
--- a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-10.C
+++ b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-10.C
@@ -17,7 +17,7 @@
 #undef inline                          // { dg-warning "undefining keyword 
'inline'" }
 #define inline __inline__ __attribute__((__always_inline__))   // { dg-warning 
"keyword 'inline' defined as macro" }
 #define likely(a) a
-#undef likely                          // { dg-warning "undefining keyword 
'likely'" "" { target c++20 } }
+#undef likely
 #define unlikely(a, b, c) a + b + c
 #define unlikely(a, b, c) a + b + c
-#undef unlikely                                // { dg-warning "undefining 
keyword 'unlikely'" "" { target c++20 } }
+#undef unlikely
diff --git a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C 
b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C
index 9ff974dfc1e1..4fde3ae36d18 100644
--- a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C
+++ b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C
@@ -104,9 +104,9 @@
 #undef deprecated                      // { dg-error "undefining keyword 
'deprecated'" "" { target c++26 } }
 #undef fallthrough                     // { dg-error "undefining keyword 
'fallthrough'" "" { target c++26 } }
 #undef indeterminate
-#undef likely                          // { dg-error "undefining keyword 
'likely'" "" { target c++26 } }
+#undef likely
 #undef maybe_unused                    // { dg-error "undefining keyword 
'maybe_unused'" "" { target c++26 } }
 #undef nodiscard                       // { dg-error "undefining keyword 
'nodiscard'" "" { target c++26 } }
 #undef noreturn                                // { dg-error "undefining 
keyword 'noreturn'" "" { target c++26 } }
 #undef no_unique_address               // { dg-error "undefining keyword 
'no_unique_address'" "" { target c++26 } }
-#undef unlikely                                // { dg-error "undefining 
keyword 'unlikely'" "" { target c++26 } }
+#undef unlikely
diff --git a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C 
b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C
index 657797b5603c..13b3b68386d8 100644
--- a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C
+++ b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C
@@ -104,9 +104,9 @@
 #undef deprecated                      // { dg-warning "undefining keyword 
'deprecated'" "" { target c++26 } }
 #undef fallthrough                     // { dg-warning "undefining keyword 
'fallthrough'" "" { target c++26 } }
 #undef indeterminate
-#undef likely                          // { dg-warning "undefining keyword 
'likely'" "" { target c++26 } }
+#undef likely
 #undef maybe_unused                    // { dg-warning "undefining keyword 
'maybe_unused'" "" { target c++26 } }
 #undef nodiscard                       // { dg-warning "undefining keyword 
'nodiscard'" "" { target c++26 } }
 #undef noreturn                                // { dg-warning "undefining 
keyword 'noreturn'" "" { target c++26 } }
 #undef no_unique_address               // { dg-warning "undefining keyword 
'no_unique_address'" "" { target c++26 } }
-#undef unlikely                                // { dg-warning "undefining 
keyword 'unlikely'" "" { target c++26 } }
+#undef unlikely
diff --git a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C 
b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C
index 7dcc37716d88..b9b365e246c8 100644
--- a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C
+++ b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C
@@ -104,9 +104,9 @@
 #undef deprecated                      // { dg-warning "undefining keyword 
'deprecated'" "" { target c++14 } }
 #undef fallthrough                     // { dg-warning "undefining keyword 
'fallthrough'" "" { target c++17 } }
 #undef indeterminate
-#undef likely                          // { dg-warning "undefining keyword 
'likely'" "" { target c++20 } }
+#undef likely
 #undef maybe_unused                    // { dg-warning "undefining keyword 
'maybe_unused'" "" { target c++17 } }
 #undef nodiscard                       // { dg-warning "undefining keyword 
'nodiscard'" "" { target c++17 } }
 #undef noreturn                                // { dg-warning "undefining 
keyword 'noreturn'" "" { target c++11 } }
 #undef no_unique_address               // { dg-warning "undefining keyword 
'no_unique_address'" "" { target c++20 } }
-#undef unlikely                                // { dg-warning "undefining 
keyword 'unlikely'" "" { target c++20 } }
+#undef unlikely
diff --git a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-9.C 
b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-9.C
index 741cdee6840e..1145c650cdf6 100644
--- a/gcc/testsuite/g++.dg/warn/Wkeyword-macro-9.C
+++ b/gcc/testsuite/g++.dg/warn/Wkeyword-macro-9.C
@@ -17,6 +17,6 @@
 #undef inline                          // { dg-error "undefining keyword 
'inline'" "" { target c++26 } }
 #define inline __inline__ __attribute__((__always_inline__))   // { dg-error 
"keyword 'inline' defined as macro" "" { target c++26 } }
 #define likely(a) a
-#undef likely                          // { dg-error "undefining keyword 
'likely'" "" { target c++26 } }
+#undef likely
 #define unlikely(a, b, c) a + b + c
 #define unlikely(a, b, c) a + b + c
diff --git a/libcpp/directives.cc b/libcpp/directives.cc
index b6dd36a88c52..b4994ca43601 100644
--- a/libcpp/directives.cc
+++ b/libcpp/directives.cc
@@ -740,9 +740,14 @@ do_undef (cpp_reader *pfile)
          && !CPP_OPTION (pfile, suppress_builtin_macro_warnings)
          && cpp_keyword_p (node))
        {
-         if (CPP_OPTION (pfile, cpp_pedantic)
-             && CPP_OPTION (pfile, cplusplus)
-             && CPP_OPTION (pfile, lang) >= CLK_GNUCXX26)
+         if (CPP_OPTION (pfile, cplusplus)
+             && (strcmp ((const char *) NODE_NAME (node), "likely") == 0
+                 || strcmp ((const char *) NODE_NAME (node),
+                            "unlikely") == 0))
+           /* CWG3053: likely and unlikely can be undefined.  */;
+         else if (CPP_OPTION (pfile, cpp_pedantic)
+                  && CPP_OPTION (pfile, cplusplus)
+                  && CPP_OPTION (pfile, lang) >= CLK_GNUCXX26)
            cpp_pedwarning (pfile, CPP_W_KEYWORD_MACRO,
                            "undefining keyword %qs", NODE_NAME (node));
          else

Reply via email to