https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120778

--- Comment #15 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:cdd015c4ddbb1ae71eea1e44654cee5ca29a6c64

commit r16-3223-gcdd015c4ddbb1ae71eea1e44654cee5ca29a6c64
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Fri Aug 15 22:31:27 2025 +0200

    c++: Warn on #undef/#define of remaining cpp.predefined macros [PR120778]

    We already warn on #undef or pedwarn on #define (but not on #define
    after #undef) of some builtin macros mentioned in cpp.predefined.

    The C++26 P2843R3 paper changes it from (compile time) undefined behavior
    to ill-formed.  The following patch arranges for warning (for #undef)
    and pedwarn (on #define) for the remaining cpp.predefined macros.
    __cpp_* feature test macros only for C++20 which added some of them
    to cpp.predefined, in earlier C++ versions it was just an extension and
    for pedantic diagnostic I think we don't need to diagnose anything,
    __STDCPP_* and __cplusplus macros for all C++ versions where they appeared.

    Like the earlier posted -Wkeyword-macro diagnostics (which is done
    regardless whether the identifier is defined as a macro or not, obviously
    most likely none of the keywords are defined as macros initially), this
    one also warns on #undef when a macro isn't defined or later #define
    after #undef.

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

            PR preprocessor/120778
            PR target/121520
    gcc/c-family/
            * c-cppbuiltin.cc (c_cpp_builtins): Implement C++26 DR 2581.  Add
            cpp_define_warn lambda and use it as well as cpp_warn where needed.
            In the if (c_dialect_cxx ()) block with __cpp_* predefinitions add
            cpp_define lambda.  Formatting fixes.
    gcc/c/
            * c-decl.cc (c_init_decl_processing): Use cpp_warn instead of
            cpp_lookup and NODE_WARN bit setting.
    gcc/cp/
            * lex.cc (cxx_init): Remove warn_on lambda.  Use cpp_warn instead
of
            cpp_lookup and NODE_WARN bit setting or warn_on.
    gcc/testsuite/
            * g++.dg/DRs/dr2581-1.C: New test.
            * g++.dg/DRs/dr2581-2.C: New test.
            * c-c++-common/cpp/pr92296-2.c: Expect warnings also on defining
            special macros after undefining them.
    libcpp/
            * include/cpplib.h (struct cpp_options): Add
            suppress_builtin_macro_warnings member.
            (cpp_warn): New inline functions.
            * init.cc (cpp_create_reader): Clear
suppress_builtin_macro_warnings.
            (cpp_init_builtins): Call cpp_warn on __cplusplus, __STDC__,
            __STDC_VERSION__, __STDC_MB_MIGHT_NEQ_WC__ and
            __STDCPP_STRICT_POINTER_SAFETY__ when appropriate.
            * directives.cc (do_undef): Warn on undefining NODE_WARN macros if
            not cpp_keyword_p.  Don't emit any NODE_WARN related diagnostics
            if CPP_OPTION (pfile, suppress_builtin_macro_warnings).
            (cpp_define, _cpp_define_builtin, cpp_undef): Temporarily set
            CPP_OPTION (pfile, suppress_builtin_macro_warnings) around
            run_directive calls.
            * macro.cc (_cpp_create_definition): Warn on defining NODE_WARN
            macros if they weren't previously defined and not cpp_keyword_p.
            Ignore NODE_WARN for diagnostics if
            CPP_OPTION (pfile, suppress_builtin_macro_warnings).

Reply via email to