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.