https://gcc.gnu.org/g:fe3c9c98bf52e1a01f903c3d685930019a57ce61
commit r17-553-gfe3c9c98bf52e1a01f903c3d685930019a57ce61 Author: Dragon Archer <[email protected]> Date: Fri May 8 18:16:15 2026 +0000 libstdc++: replace assert with __glibcxx_assert [PR125228] Unlike `__glibcxx_assert` which is guarded by `_GLIBCXX_ASSERTIONS` and enabled only in Debug build of libstdc++, `assert` is either always enabled, or always disabled if manually defining `NDEBUG` before `#include <cassert>` or `#include <assert.h>`. This not only makes `assert` inflexible, but also introduces extra runtime overhead and/or increased binary size in Release builds. Uses of `assert` without `NDEBUG` introduces `__FILE__` into the final library, and unconditionally checks the assertions. This patch replaces the uses of `assert` in ryu and debug.cc with `__glibcxx_assert`, and removed their direct dependency on `<cassert>`. To avoid modifying the third-party ryu headers, this patch redefines `assert` to `__glibcxx_assert` when including the ryu headers. libstdc++-v3/ChangeLog: PR libstdc++/125228 * src/c++11/debug.cc: Replace assert with __glibcxx_assert, and remove the include of <cassert>. * src/c++17/floating_to_chars.cc: Likewise, but redefine assert as __glibcxx_assert. Reviewed-by: Patrick Palka <[email protected]> Reviewed-by: Jonathan Wakely <[email protected]> Diff: --- libstdc++-v3/src/c++11/debug.cc | 33 ++++++++++++++--------------- libstdc++-v3/src/c++17/floating_to_chars.cc | 5 ++++- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index 7049d5f1238c..9a36bdfabb9b 100644 --- a/libstdc++-v3/src/c++11/debug.cc +++ b/libstdc++-v3/src/c++11/debug.cc @@ -33,7 +33,6 @@ #include <debug/safe_local_iterator.h> #include <debug/vector> -#include <cassert> #include <cstdio> // for std::fprintf, stderr #include <cstdlib> // for std::abort #include <cctype> // for std::isspace. @@ -888,7 +887,7 @@ namespace void print_named_name(PrintContext& ctx, const _Parameter::_Named& named) { - assert(named._M_name); + __glibcxx_assert(named._M_name); pretty_print(ctx, named._M_name, print_word); } @@ -985,7 +984,7 @@ namespace print_iterator_state(ctx, iterator); else if (__builtin_strcmp(fname, "sequence") == 0) { - assert(iterator._M_sequence); + __glibcxx_assert(iterator._M_sequence); print_address(ctx, iterator._M_sequence); } else if (__builtin_strcmp(fname, "seq_type") == 0) @@ -999,43 +998,43 @@ namespace void print_field(PrintContext& ctx, const _Parameter& param, const char* fname) { - assert(param._M_kind != _Parameter::__unused_param); + __glibcxx_assert(param._M_kind != _Parameter::__unused_param); const auto& variant = param._M_variant; switch (param._M_kind) { case _Parameter::__iterator: if (!print_iterator_field(ctx, fname, variant._M_iterator)) - assert(false); + __glibcxx_assert(false); break; case _Parameter::__sequence: if (!print_instance_field(ctx, fname, variant._M_sequence)) - assert(false); + __glibcxx_assert(false); break; case _Parameter::__integer: if (!print_named_field(ctx, fname, variant._M_integer)) - assert(false); + __glibcxx_assert(false); break; case _Parameter::__string: if (!print_named_field(ctx, fname, variant._M_string)) - assert(false); + __glibcxx_assert(false); break; case _Parameter::__instance: if (!print_instance_field(ctx, fname, variant._M_instance)) - assert(false); + __glibcxx_assert(false); break; case _Parameter::__iterator_value_type: if (!print_type_field(ctx, fname, variant._M_iterator_value_type)) - assert(false); + __glibcxx_assert(false); break; default: - assert(false); + __glibcxx_assert(false); break; } } @@ -1198,9 +1197,9 @@ namespace } // Get the parameter number - assert(*str >= '1' && *str <= '9'); + __glibcxx_assert(*str >= '1' && *str <= '9'); size_t param_index = *str - '0' - 1; - assert(param_index < num_parameters); + __glibcxx_assert(param_index < num_parameters); const auto& param = parameters[param_index]; // '.' separates the parameter number from the field @@ -1208,7 +1207,7 @@ namespace ++str; if (*str != '.') { - assert(*str == ';'); + __glibcxx_assert(*str == ';'); ++str; if (param._M_kind == _Parameter::__integer) print_integer(ctx, param._M_variant._M_integer._M_value); @@ -1226,8 +1225,8 @@ namespace ++str; while (*str != ';') { - assert(*str); - assert(field_idx < max_field_len - 1); + __glibcxx_assert(*str); + __glibcxx_assert(field_idx < max_field_len - 1); field[field_idx++] = *str++; } ++str; @@ -1382,7 +1381,7 @@ namespace __gnu_debug print_literal(ctx, "Error: "); // Print the error message - assert(_M_text); + __glibcxx_assert(_M_text); print_string(ctx, _M_text, -1, _M_parameters, _M_num_parameters); print_literal(ctx, ".\n"); diff --git a/libstdc++-v3/src/c++17/floating_to_chars.cc b/libstdc++-v3/src/c++17/floating_to_chars.cc index 9bddffd70ff2..264e520e1876 100644 --- a/libstdc++-v3/src/c++17/floating_to_chars.cc +++ b/libstdc++-v3/src/c++17/floating_to_chars.cc @@ -26,7 +26,6 @@ #include <bit> #include <cfenv> -#include <cassert> #include <cmath> #include <cstdio> #include <cstring> @@ -106,6 +105,9 @@ namespace namespace ryu { +#pragma push_macro("assert") +#undef assert +#define assert __glibcxx_assert #include "ryu/common.h" #include "ryu/digit_table.h" #include "ryu/d2s_intrinsics.h" @@ -123,6 +125,7 @@ namespace # include "ryu/ryu_generic_128.h" # include "ryu/generic_128.c" } // namespace generic128 +#pragma pop_macro("assert") using generic128::floating_decimal_128; using generic128::generic_binary_to_decimal;
