diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2024-05-22 10:32:43 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2024-05-22 23:10:05 +0100 |
commit | b2fdd508d7e63158e9d2a6dd04f901d02900def3 (patch) | |
tree | ae2a7a763beb0309d9c07930a555ad2b3d4e5014 | |
parent | 3c98d06a9016a0fa3a806879bd168f13b8a606f8 (diff) | |
download | gcc-b2fdd508d7e63158e9d2a6dd04f901d02900def3.zip gcc-b2fdd508d7e63158e9d2a6dd04f901d02900def3.tar.gz gcc-b2fdd508d7e63158e9d2a6dd04f901d02900def3.tar.bz2 |
libstdc++: Guard use of sized deallocation [PR114940]
Clang does not enable -fsized-deallocation by default, which means it
can't compile our <stacktrace> and <generator> headers.
Make the __cpp_lib_generator macro depend on the compiler-defined
__cpp_sized_deallocation macro, and change <stacktrace> to use unsized
deallocation when __cpp_sized_deallocation isn't defined.
libstdc++-v3/ChangeLog:
PR libstdc++/114940
* include/bits/version.def (generator): Depend on
__cpp_sized_deallocation.
* include/bits/version.h: Regenerate.
* include/std/stacktrace (_GLIBCXX_SIZED_DELETE): New macro.
(basic_stacktrace::_Impl::_M_deallocate): Use it.
-rw-r--r-- | libstdc++-v3/include/bits/version.def | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/version.h | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/std/stacktrace | 13 |
3 files changed, 13 insertions, 4 deletions
diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index f0ba4f2..5cbc9d1 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -1651,7 +1651,7 @@ ftms = { values = { v = 202207; cxxmin = 23; - extra_cond = "__glibcxx_coroutine"; + extra_cond = "__glibcxx_coroutine && __cpp_sized_deallocation"; }; }; diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index f30f51d..164ebed 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -1834,7 +1834,7 @@ #undef __glibcxx_want_forward_like #if !defined(__cpp_lib_generator) -# if (__cplusplus >= 202100L) && (__glibcxx_coroutine) +# if (__cplusplus >= 202100L) && (__glibcxx_coroutine && __cpp_sized_deallocation) # define __glibcxx_generator 202207L # if defined(__glibcxx_want_all) || defined(__glibcxx_want_generator) # define __cpp_lib_generator 202207L diff --git a/libstdc++-v3/include/std/stacktrace b/libstdc++-v3/include/std/stacktrace index d217d63..962dbed 100644 --- a/libstdc++-v3/include/std/stacktrace +++ b/libstdc++-v3/include/std/stacktrace @@ -553,6 +553,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION # define _GLIBCXX_OPERATOR_DELETE ::operator delete #endif +#if __cpp_sized_deallocation +# define _GLIBCXX_SIZED_DELETE(T, p, n) \ + _GLIBCXX_OPERATOR_DELETE((p), (n) * sizeof(T)) +#else +# define _GLIBCXX_SIZED_DELETE(T, p, n) _GLIBCXX_OPERATOR_DELETE(p) +#endif + // Precondition: _M_frames == nullptr && __n != 0 pointer _M_allocate(allocator_type& __alloc, size_type __n) noexcept @@ -592,8 +599,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (_M_capacity) { if constexpr (is_same_v<allocator_type, allocator<value_type>>) - _GLIBCXX_OPERATOR_DELETE (static_cast<void*>(_M_frames), - _M_capacity * sizeof(value_type)); + _GLIBCXX_SIZED_DELETE(value_type, + static_cast<void*>(_M_frames), + _M_capacity); else __alloc.deallocate(_M_frames, _M_capacity); _M_frames = nullptr; @@ -601,6 +609,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } } +#undef _GLIBCXX_SIZED_DELETE #undef _GLIBCXX_OPERATOR_DELETE #undef _GLIBCXX_OPERATOR_NEW |