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.

Reply via email to