https://gcc.gnu.org/g:42046a0f5d29013b1c016ee92b28f819686ddcc0

commit r16-278-g42046a0f5d29013b1c016ee92b28f819686ddcc0
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Tue Dec 10 20:40:42 2024 +0000

    libstdc++: Use constexpr-if to simplify std::vector relocation
    
    Simplify std::vector's use of std::__relocate_a by using 'if constexpr'
    even in C++11 and C++14, with diagnostic pragmas to disable warnings.
    This allows us to call std::__relocate_a directly, instead of via
    _S_relocate and tag distpatching.
    
    Preserve _S_relocate so that explicit instantiations still get it, but
    make it a no-op when _S_use_relocate() is false, so that we don't
    instantiate __relocate_a if it isn't needed.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/stl_vector.h (_S_do_relocate): Remove.
            (_S_relocate): Remove tag dispatching path.
            * include/bits/vector.tcc (reserve, _M_realloc_insert)
            (_M_realloc_append, _M_default_append): Add diagnostic pragmas
            and use 'if constexpr' in C++11 and C++14. Call
            std::__relocate_a directly instead of _S_relocate.
    
    Reviewed-by: Tomasz KamiƄski <tkami...@redhat.com>

Diff:
---
 libstdc++-v3/include/bits/stl_vector.h | 26 ++++++---------------
 libstdc++-v3/include/bits/vector.tcc   | 41 ++++++++++++++++++++++------------
 2 files changed, 34 insertions(+), 33 deletions(-)

diff --git a/libstdc++-v3/include/bits/stl_vector.h 
b/libstdc++-v3/include/bits/stl_vector.h
index aff9d5d9ca5b..57680b7bbcf3 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -518,29 +518,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
       }
 
-      static pointer
-      _S_do_relocate(pointer __first, pointer __last, pointer __result,
-                    _Tp_alloc_type& __alloc, true_type) noexcept
-      {
-       return std::__relocate_a(__first, __last, __result, __alloc);
-      }
-
-      static pointer
-      _S_do_relocate(pointer, pointer, pointer __result,
-                    _Tp_alloc_type&, false_type) noexcept
-      { return __result; }
-
       static _GLIBCXX20_CONSTEXPR pointer
       _S_relocate(pointer __first, pointer __last, pointer __result,
                  _Tp_alloc_type& __alloc) noexcept
       {
-#if __cpp_if_constexpr
-       // All callers have already checked _S_use_relocate() so just do it.
-       return std::__relocate_a(__first, __last, __result, __alloc);
-#else
-       using __do_it = __bool_constant<_S_use_relocate()>;
-       return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
-#endif
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+       if constexpr (_S_use_relocate())
+         return std::__relocate_a(__first, __last, __result, __alloc);
+       else
+         return __result;
+#pragma GCC diagnostic pop
       }
 #endif // C++11
 
diff --git a/libstdc++-v3/include/bits/vector.tcc 
b/libstdc++-v3/include/bits/vector.tcc
index b21e1d3b7a2c..e18f01ab0ae8 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -61,6 +61,9 @@ namespace std _GLIBCXX_VISIBILITY(default)
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+
   template<typename _Tp, typename _Alloc>
     _GLIBCXX20_CONSTEXPR
     void
@@ -74,11 +77,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
          const size_type __old_size = size();
          pointer __tmp;
 #if __cplusplus >= 201103L
-         if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
+         if constexpr (_S_use_relocate())
            {
              __tmp = this->_M_allocate(__n);
-             _S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish,
-                         __tmp, _M_get_Tp_allocator());
+             std::__relocate_a(this->_M_impl._M_start, this->_M_impl._M_finish,
+                               __tmp, _M_get_Tp_allocator());
            }
          else
 #endif
@@ -98,6 +101,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
          this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
        }
     }
+#pragma GCC diagnostic pop
 
 #if __cplusplus >= 201103L
   template<typename _Tp, typename _Alloc>
@@ -444,6 +448,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif
     }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
 #if __cplusplus >= 201103L
   template<typename _Tp, typename _Alloc>
     template<typename... _Args>
@@ -488,14 +494,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif
 
 #if __cplusplus >= 201103L
-       if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
+       if constexpr (_S_use_relocate())
          {
            // Relocation cannot throw.
-           __new_finish = _S_relocate(__old_start, __position.base(),
-                                      __new_start, _M_get_Tp_allocator());
+           __new_finish = std::__relocate_a(__old_start, __position.base(),
+                                            __new_start,
+                                            _M_get_Tp_allocator());
            ++__new_finish;
-           __new_finish = _S_relocate(__position.base(), __old_finish,
-                                      __new_finish, _M_get_Tp_allocator());
+           __new_finish = std::__relocate_a(__position.base(), __old_finish,
+                                            __new_finish,
+                                            _M_get_Tp_allocator());
          }
        else
 #endif
@@ -593,11 +601,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif
 
 #if __cplusplus >= 201103L
-       if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
+       if constexpr (_S_use_relocate())
          {
            // Relocation cannot throw.
-           __new_finish = _S_relocate(__old_start, __old_finish,
-                                      __new_start, _M_get_Tp_allocator());
+           __new_finish = std::__relocate_a(__old_start, __old_finish,
+                                            __new_start,
+                                            _M_get_Tp_allocator());
            ++__new_finish;
          }
        else
@@ -645,6 +654,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       this->_M_impl._M_finish = __new_finish;
       this->_M_impl._M_end_of_storage = __new_start + __len;
     }
+#pragma GCC diagnostic pop
 
   template<typename _Tp, typename _Alloc>
     _GLIBCXX20_CONSTEXPR
@@ -751,6 +761,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }
 
 #if __cplusplus >= 201103L
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
   template<typename _Tp, typename _Alloc>
     _GLIBCXX20_CONSTEXPR
     void
@@ -794,10 +806,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
                std::__uninitialized_default_n_a(__new_start + __size, __n,
                                                 _M_get_Tp_allocator());
 
-               if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
+               if constexpr (_S_use_relocate())
                  {
-                   _S_relocate(__old_start, __old_finish,
-                               __new_start, _M_get_Tp_allocator());
+                   std::__relocate_a(__old_start, __old_finish,
+                                     __new_start, _M_get_Tp_allocator());
                  }
                else
                  {
@@ -842,6 +854,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
            }
        }
     }
+#pragma GCC diagnostic pop
 
   template<typename _Tp, typename _Alloc>
     _GLIBCXX20_CONSTEXPR

Reply via email to