https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110287

--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Do you mean something like this?

diff --git a/libstdc++-v3/include/bits/stl_vector.h
b/libstdc++-v3/include/bits/stl_vector.h
index 70ced3d101f..a4dbfeb8b5b 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -1902,6 +1902,21 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        return (__len < size() || __len > max_size()) ? max_size() : __len;
       }

+      // Called by _M_insert_aux etc.
+      _GLIBCXX20_CONSTEXPR
+      size_type
+      _M_check_len_1(const char* __s) const
+      {
+       if (__builtin_constant_p(size()))
+         {
+           if (size() == 0)
+             return 1;
+           else if (size() < max_size() / 2)
+             return size() * 2;
+         }
+       return _M_check_len(1, __s);
+      }
+
       // Called by constructors to check initial size.
       static _GLIBCXX20_CONSTEXPR size_type
       _S_check_init_len(size_type __n, const allocator_type& __a)
diff --git a/libstdc++-v3/include/bits/vector.tcc
b/libstdc++-v3/include/bits/vector.tcc
index acd11e2dc68..1f0b3123c3b 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -458,8 +458,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     _M_realloc_insert(iterator __position, const _Tp& __x)
 #endif
     {
-      const size_type __len =
-       _M_check_len(size_type(1), "vector::_M_realloc_insert");
+      const size_type __len = _M_check_len_1("vector::_M_realloc_insert");
       pointer __old_start = this->_M_impl._M_start;
       pointer __old_finish = this->_M_impl._M_finish;
       const size_type __elems_before = __position - begin();
@@ -946,7 +945,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       else
        {
          const size_type __len =
-           _M_check_len(size_type(1), "vector<bool>::_M_insert_aux");
+           _M_check_len_1("vector<bool>::_M_insert_aux");
          _Bit_pointer __q = this->_M_allocate(__len);
          iterator __start(std::__addressof(*__q), 0);
          iterator __i = _M_copy_aligned(begin(), __position, __start);

Reply via email to