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 <jakub@redhat.com>
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.