https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120397
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
--- a/libstdc++-v3/include/bits/stl_uninitialized.h
+++ b/libstdc++-v3/include/bits/stl_uninitialized.h
@@ -118,7 +118,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
~_UninitDestroyGuard()
{
if (__builtin_expect(_M_cur != 0, 0))
- std::_Destroy(_M_first, *_M_cur);
+ _S_destroy(_M_first, *_M_cur);
}
_GLIBCXX20_CONSTEXPR
@@ -129,6 +129,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
private:
_UninitDestroyGuard(const _UninitDestroyGuard&);
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions"
+ template<typename _Iter>
+ _GLIBCXX20_CONSTEXPR
+ static void
+ _S_destroy(_Iter __first, _Iter __last)
+ {
+#if __cplusplus == 201703L
+ using _ValT = typename iterator_traits<_Iter>::value_type;
+ if constexpr (is_array<_ValT>::value)
+ for (; __first != __last; ++__first)
+ _S_destroy(*__first, *__first + extent<_ValT>::value);
+ else
+#endif
+ std::_Destroy(__first, __last);
+ }
+#pragma GCC diagnostic push
};
// This is the default implementation of std::uninitialized_copy.