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

--- Comment #18 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <[email protected]>:

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

commit r16-6547-gf8c32184b85ce71c154fa96cd5ca700aab902656
Author: Jakub Jelinek <[email protected]>
Date:   Wed Jan 7 15:00:50 2026 +0100

    libstdc++: Use gnu_inline attribute on constexpr exception methods
[PR123183]

    As mentioned in
    https://gcc.gnu.org/pipermail/gcc-patches/2026-January/704712.html
    in the gnu::constexpr_only thread, gnu::gnu_inline attribute actually
    seems to work for most of what we need for C++26 constexpr exceptions
    (i.e. when we want out of line bodies for C++ < 26 and need to use
    constexpr for C++26, yet don't want for reasons mentioned in those
    two PRs the bodies of those constexpr methods to be emitted inline).
    Unfortunately clang++ doesn't handle it 100% properly and requires
    the redundant inline keyword to make it work (even when the methods
    are constexpr and thus implicilty inline), g++ doesn't require that,
    so the patch adds also the redundant inline keywords and not just
    the [[__gnu__::__gnu_inline__]] attribute.
    This way if something wants to inline those functions it can, but
    if their address is taken, we just rely on libstdc++.{so,a} to provide
    those (which it does as before because those TUs are compiled with
    older -std= modes).
    The earlier r16-6477-gd5743234731 commit made sure gnu::gnu_inline
    constexpr virtual methods can be key methods, so vtables and rtti can
    be emitted only in the TU defining non-gnu_inline versions of those.

    2026-01-07  Jakub Jelinek  <[email protected]>

            PR libstdc++/123183
            PR libstdc++/123326
            * libsupc++/exception (std::bad_exception::~bad_exception(),
            std::bad_exception::what()): Add inline keyword and
            [[__gnu__::__gnu_inline__]] attribute to the C++26 constexpr
            exceptions definitions.
            * libsupc++/exception.h (std::exception::~exception(),
            std::exception::what()): Likewise.
            * libsupc++/exception_ptr.h
(std::exception_ptr::exception_ptr(void*)):
            Likewise.
            * libsupc++/nested_exception.h
            (std::nested_exception::~nested_exception()): Likewise.
            * libsupc++/typeinfo (std::bad_cast::~bad_cast(),
            std::bad_cast::what(), std::bad_typeid::~bad_typeid(),
            std::bad_typeid::what()): Likewise.
            * include/bits/new_except.h (std::bad_alloc::~bad_alloc(),
            std::bad_alloc::what(),
            std::bad_array_new_length::~bad_array_new_length(),
            std::bad_array_new_length::what()): Likewise.
            * include/bits/stdexcept_except.h
            (std::logic_error::logic_error(const string&),
            std::logic_error::logic_error(const char*),
            std::logic_error::~logic_error(), std::logic_error::what(),
            std::domain_error::domain_error(const string&),
            std::domain_error::domain_error(const char*),
            std::invalid_argument::invalid_argument(const string&),
            std::invalid_argument::invalid_argument(const char*),
            std::length_error::length_error(const string&),
            std::length_error::length_error(const char*),
            std::out_of_range::out_of_range(const string&),
            std::out_of_range::out_of_range(const char*),
            std::runtime_error::runtime_error(const string&),
            std::runtime_error::runtime_error(const char*),
            std::runtime_error::~runtime_error(), std::runtime_error::what(),
            std::overflow_error::overflow_error(const string&),
            std::overflow_error::overflow_error(const char*),
            std::overflow_error::~overflow_error(),
            std::underflow_error::underflow_error(const string&),
            std::underflow_error::underflow_error(const char*),
            std::underflow_error::~underflow_error()): Likewise.
            (std::domain_error::~domain_error(),
            std::invalid_argument::~invalid_argument(),
            std::length_error::~length_error(),
            std::out_of_range::~out_of_range()): Likewise.  Also change
            _GLIBCXX_NOTHROW to noexcept on those definitions.

Reply via email to