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.
---

Tested x86_64-linux.

 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 aff9d5d9ca5..57680b7bbcf 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 b21e1d3b7a2..e18f01ab0ae 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
-- 
2.49.0

Reply via email to