public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
* Pointlessly fragile constexpr vector implementation I need some guidance on.
@ 2020-10-28  1:08 Josh Marshall
       [not found] ` <CAJY4aWEeHrXjab-EnnYqaV12oOdSTOm3Wku4AGTWR-gFfKBcDA@mail.gmail.com>
  2020-10-30 11:33 ` Jonathan Wakely
  0 siblings, 2 replies; 3+ messages in thread
From: Josh Marshall @ 2020-10-28  1:08 UTC (permalink / raw)
  To: gcc-help

Hello all,

This side project is definitely showing me a few of my shortcomings as a
programmer, so please bear with me while I try to learn.  I have an
implementation of constexpr vector which works in the null case, but fails
on any case when it is constructed with contents or has contents added.


diff --git a/include/ChangeLog b/include/ChangeLog
index 41e3b76766e..d24b105b145 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -22,6 +22,11 @@
  * dwarf2.h (enum dwarf_sect_v5): A new enum section for the
  sections in a DWARF 5 DWP file (DWP version 5).

+2020-09-09  Caroline Tice  <cmtice@google.com>
+
+ * dwarf2.h (enum dwarf_sect_v5): A new enum section for the
+ sections in a DWARF 5 DWP file (DWP version 5).
+
 2020-09-08  Felix Willgerodt  <felix.willgerodt@intel.com>

  * floatformat.h (floatformat_bfloat16_big): New.
diff --git a/libstdc++-v3/include/bits/alloc_traits.h
b/libstdc++-v3/include/bits/alloc_traits.h
index 86d8ed221ff..e989637aeb7 100644
--- a/libstdc++-v3/include/bits/alloc_traits.h
+++ b/libstdc++-v3/include/bits/alloc_traits.h
@@ -717,6 +717,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
    */

   template<typename _ForwardIterator, typename _Allocator>
+    _GLIBCXX20_CONSTEXPR
     void
     _Destroy(_ForwardIterator __first, _ForwardIterator __last,
      _Allocator& __alloc)
@@ -731,7 +732,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }

   template<typename _ForwardIterator, typename _Tp>
-    inline void
+    inline _GLIBCXX20_CONSTEXPR void
     _Destroy(_ForwardIterator __first, _ForwardIterator __last,
      allocator<_Tp>&)
     {
diff --git a/libstdc++-v3/include/bits/deque.tcc
b/libstdc++-v3/include/bits/deque.tcc
index 651ae70a84b..8236bef15e9 100644
--- a/libstdc++-v3/include/bits/deque.tcc
+++ b/libstdc++-v3/include/bits/deque.tcc
@@ -974,6 +974,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
   // Overload for deque::iterators, exploiting the "segmented-iterator
   // optimization".
   template<typename _Tp, typename _VTp>
+    _GLIBCXX20_CONSTEXPR
     void
     __fill_a1(const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&
__first,
       const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>& __last,
diff --git a/libstdc++-v3/include/bits/stl_algobase.h
b/libstdc++-v3/include/bits/stl_algobase.h
index d19f68871ab..128d8d8d4ad 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -953,23 +953,24 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
     { std::__fill_a1(__first.base(), __last.base(), __value); }

   template<typename _Tp, typename _VTp>
+    _GLIBCXX20_CONSTEXPR
     void
     __fill_a1(const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&,
       const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&,
       const _VTp&);

   void
+  _GLIBCXX20_CONSTEXPR
   __fill_a1(_GLIBCXX_STD_C::_Bit_iterator, _GLIBCXX_STD_C::_Bit_iterator,
     const bool&);

   template<typename _FIte, typename _Tp>
-    _GLIBCXX20_CONSTEXPR
-    inline void
+    inline _GLIBCXX20_CONSTEXPR void
     __fill_a(_FIte __first, _FIte __last, const _Tp& __value)
     { std::__fill_a1(__first, __last, __value); }

   template<typename _Ite, typename _Seq, typename _Cat, typename _Tp>
-    void
+    _GLIBCXX20_CONSTEXPR void
     __fill_a(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
      const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
      const _Tp&);
diff --git a/libstdc++-v3/include/bits/stl_bvector.h
b/libstdc++-v3/include/bits/stl_bvector.h
index d6f5435bdfb..8548b350c13 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -74,18 +74,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     _Bit_type * _M_p;
     _Bit_type _M_mask;

+    _GLIBCXX20_CONSTEXPR
     _Bit_reference(_Bit_type * __x, _Bit_type __y)
     : _M_p(__x), _M_mask(__y) { }

+    _GLIBCXX20_CONSTEXPR
     _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }

 #if __cplusplus >= 201103L
+    _GLIBCXX20_CONSTEXPR
     _Bit_reference(const _Bit_reference&) = default;
 #endif

+    _GLIBCXX20_CONSTEXPR
     operator bool() const _GLIBCXX_NOEXCEPT
     { return !!(*_M_p & _M_mask); }

+    _GLIBCXX20_CONSTEXPR
     _Bit_reference&
     operator=(bool __x) _GLIBCXX_NOEXCEPT
     {
@@ -96,24 +101,29 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     _Bit_reference&
     operator=(const _Bit_reference& __x) _GLIBCXX_NOEXCEPT
     { return *this = bool(__x); }

+    _GLIBCXX20_CONSTEXPR
     bool
     operator==(const _Bit_reference& __x) const
     { return bool(*this) == bool(__x); }

+    _GLIBCXX20_CONSTEXPR
     bool
     operator<(const _Bit_reference& __x) const
     { return !bool(*this) && bool(__x); }

+    _GLIBCXX20_CONSTEXPR
     void
     flip() _GLIBCXX_NOEXCEPT
     { *_M_p ^= _M_mask; }
   };

 #if __cplusplus >= 201103L
+  _GLIBCXX20_CONSTEXPR
   inline void
   swap(_Bit_reference __x, _Bit_reference __y) noexcept
   {
@@ -122,6 +132,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     __y = __tmp;
   }

+  _GLIBCXX20_CONSTEXPR
   inline void
   swap(_Bit_reference __x, bool& __y) noexcept
   {
@@ -130,6 +141,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     __y = __tmp;
   }

+  _GLIBCXX20_CONSTEXPR
   inline void
   swap(bool& __x, _Bit_reference __y) noexcept
   {
@@ -145,9 +157,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     _Bit_type * _M_p;
     unsigned int _M_offset;

+    _GLIBCXX20_CONSTEXPR
     _Bit_iterator_base(_Bit_type * __x, unsigned int __y)
     : _M_p(__x), _M_offset(__y) { }

+    _GLIBCXX20_CONSTEXPR
     void
     _M_bump_up()
     {
@@ -158,6 +172,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  }
     }

+    _GLIBCXX20_CONSTEXPR
     void
     _M_bump_down()
     {
@@ -168,6 +183,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  }
     }

+    _GLIBCXX20_CONSTEXPR
     void
     _M_incr(ptrdiff_t __i)
     {
@@ -196,31 +212,31 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return __x._M_offset <=> __y._M_offset;
     }
 #else
-    friend bool
+    friend _GLIBCXX20_CONSTEXPR bool
     operator<(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
     {
       return __x._M_p < __y._M_p
     || (__x._M_p == __y._M_p && __x._M_offset < __y._M_offset);
     }

-    friend bool
+    friend _GLIBCXX20_CONSTEXPR bool
     operator!=(const _Bit_iterator_base& __x, const _Bit_iterator_base&
__y)
     { return !(__x == __y); }

-    friend bool
+    friend _GLIBCXX20_CONSTEXPR bool
     operator>(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
     { return __y < __x; }

-    friend bool
+    friend _GLIBCXX20_CONSTEXPR bool
     operator<=(const _Bit_iterator_base& __x, const _Bit_iterator_base&
__y)
     { return !(__y < __x); }

-    friend bool
+    friend _GLIBCXX20_CONSTEXPR bool
     operator>=(const _Bit_iterator_base& __x, const _Bit_iterator_base&
__y)
     { return !(__x < __y); }
 #endif // three-way comparison

-    friend ptrdiff_t
+    friend _GLIBCXX20_CONSTEXPR ptrdiff_t
     operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
     {
       return (int(_S_word_bit) * (__x._M_p - __y._M_p)
@@ -238,19 +254,24 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif
     typedef _Bit_iterator   iterator;

+    _GLIBCXX20_CONSTEXPR
     _Bit_iterator() : _Bit_iterator_base(0, 0) { }

+    _GLIBCXX20_CONSTEXPR
     _Bit_iterator(_Bit_type * __x, unsigned int __y)
     : _Bit_iterator_base(__x, __y) { }

+    _GLIBCXX20_CONSTEXPR
     iterator
     _M_const_cast() const
     { return *this; }

+    _GLIBCXX20_CONSTEXPR
     reference
     operator*() const
     { return reference(_M_p, 1UL << _M_offset); }

+    _GLIBCXX20_CONSTEXPR
     iterator&
     operator++()
     {
@@ -258,6 +279,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     iterator
     operator++(int)
     {
@@ -266,6 +288,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return __tmp;
     }

+    _GLIBCXX20_CONSTEXPR
     iterator&
     operator--()
     {
@@ -273,6 +296,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     iterator
     operator--(int)
     {
@@ -281,6 +305,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return __tmp;
     }

+    _GLIBCXX20_CONSTEXPR
     iterator&
     operator+=(difference_type __i)
     {
@@ -288,6 +313,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     iterator&
     operator-=(difference_type __i)
     {
@@ -295,10 +321,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     reference
     operator[](difference_type __i) const
     { return *(*this + __i); }

+    _GLIBCXX20_CONSTEXPR
     friend iterator
     operator+(const iterator& __x, difference_type __n)
     {
@@ -307,10 +335,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return __tmp;
     }

+    _GLIBCXX20_CONSTEXPR
     friend iterator
     operator+(difference_type __n, const iterator& __x)
     { return __x + __n; }

+    _GLIBCXX20_CONSTEXPR
     friend iterator
     operator-(const iterator& __x, difference_type __n)
     {
@@ -331,22 +361,28 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif
     typedef _Bit_const_iterator  const_iterator;

+    _GLIBCXX20_CONSTEXPR
     _Bit_const_iterator() : _Bit_iterator_base(0, 0) { }

+    _GLIBCXX20_CONSTEXPR
     _Bit_const_iterator(_Bit_type * __x, unsigned int __y)
     : _Bit_iterator_base(__x, __y) { }

+    _GLIBCXX20_CONSTEXPR
     _Bit_const_iterator(const _Bit_iterator& __x)
     : _Bit_iterator_base(__x._M_p, __x._M_offset) { }

+    _GLIBCXX20_CONSTEXPR
     _Bit_iterator
     _M_const_cast() const
     { return _Bit_iterator(_M_p, _M_offset); }

+    _GLIBCXX20_CONSTEXPR
     const_reference
     operator*() const
     { return _Bit_reference(_M_p, 1UL << _M_offset); }

+    _GLIBCXX20_CONSTEXPR
     const_iterator&
     operator++()
     {
@@ -354,6 +390,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     const_iterator
     operator++(int)
     {
@@ -362,6 +399,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return __tmp;
     }

+    _GLIBCXX20_CONSTEXPR
     const_iterator&
     operator--()
     {
@@ -369,6 +407,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     const_iterator
     operator--(int)
     {
@@ -377,6 +416,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return __tmp;
     }

+    _GLIBCXX20_CONSTEXPR
     const_iterator&
     operator+=(difference_type __i)
     {
@@ -384,6 +424,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     const_iterator&
     operator-=(difference_type __i)
     {
@@ -391,10 +432,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }

+    _GLIBCXX20_CONSTEXPR
     const_reference
     operator[](difference_type __i) const
     { return *(*this + __i); }

+    _GLIBCXX20_CONSTEXPR
     friend const_iterator
     operator+(const const_iterator& __x, difference_type __n)
     {
@@ -403,6 +446,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return __tmp;
     }

+    _GLIBCXX20_CONSTEXPR
     friend const_iterator
     operator-(const const_iterator& __x, difference_type __n)
     {
@@ -411,6 +455,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return __tmp;
     }

+    _GLIBCXX20_CONSTEXPR
     friend const_iterator
     operator+(difference_type __n, const const_iterator& __x)
     { return __x + __n; }
@@ -434,25 +479,32 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  struct {
   _Bit_type* _M_p;
   // Allow assignment from iterators (assume offset is zero):
+    _GLIBCXX20_CONSTEXPR
   void operator=(_Bit_iterator __it) { _M_p = __it._M_p; }
  } _M_start;
 #endif
  _Bit_iterator _M_finish;
  _Bit_pointer _M_end_of_storage;

+  _GLIBCXX20_CONSTEXPR
  _Bvector_impl_data() _GLIBCXX_NOEXCEPT
  : _M_start(), _M_finish(), _M_end_of_storage()
  { }

 #if __cplusplus >= 201103L
+  _GLIBCXX20_CONSTEXPR
  _Bvector_impl_data(const _Bvector_impl_data&) = default;
+
+  _GLIBCXX20_CONSTEXPR
  _Bvector_impl_data&
  operator=(const _Bvector_impl_data&) = default;

+  _GLIBCXX20_CONSTEXPR
  _Bvector_impl_data(_Bvector_impl_data&& __x) noexcept
  : _Bvector_impl_data(__x)
  { __x._M_reset(); }

+  _GLIBCXX20_CONSTEXPR
  void
  _M_move_data(_Bvector_impl_data&& __x) noexcept
  {
@@ -461,10 +513,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  }
 #endif

+  _GLIBCXX20_CONSTEXPR
  void
  _M_reset() _GLIBCXX_NOEXCEPT
  { *this = _Bvector_impl_data(); }

+  _GLIBCXX20_CONSTEXPR
  void
  _M_swap_data(_Bvector_impl_data& __x) _GLIBCXX_NOEXCEPT
  {
@@ -477,11 +531,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       struct _Bvector_impl
  : public _Bit_alloc_type, public _Bvector_impl_data
       {
+  _GLIBCXX20_CONSTEXPR
  _Bvector_impl() _GLIBCXX_NOEXCEPT_IF(
   is_nothrow_default_constructible<_Bit_alloc_type>::value)
  : _Bit_alloc_type()
  { }

+  _GLIBCXX20_CONSTEXPR
  _Bvector_impl(const _Bit_alloc_type& __a) _GLIBCXX_NOEXCEPT
  : _Bit_alloc_type(__a)
  { }
@@ -489,15 +545,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
  // Not defaulted, to enforce noexcept(true) even when
  // !is_nothrow_move_constructible<_Bit_alloc_type>.
+  _GLIBCXX20_CONSTEXPR
  _Bvector_impl(_Bvector_impl&& __x) noexcept
  : _Bit_alloc_type(std::move(__x)), _Bvector_impl_data(std::move(__x))
  { }

+  _GLIBCXX20_CONSTEXPR
  _Bvector_impl(_Bit_alloc_type&& __a, _Bvector_impl&& __x) noexcept
  : _Bit_alloc_type(std::move(__a)), _Bvector_impl_data(std::move(__x))
  { }
 #endif

+  _GLIBCXX20_CONSTEXPR
  _Bit_type*
  _M_end_addr() const _GLIBCXX_NOEXCEPT
  {
@@ -510,45 +569,55 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     public:
       typedef _Alloc allocator_type;

+      _GLIBCXX20_CONSTEXPR
       _Bit_alloc_type&
       _M_get_Bit_allocator() _GLIBCXX_NOEXCEPT
       { return this->_M_impl; }

+      _GLIBCXX20_CONSTEXPR
       const _Bit_alloc_type&
       _M_get_Bit_allocator() const _GLIBCXX_NOEXCEPT
       { return this->_M_impl; }

+      _GLIBCXX20_CONSTEXPR
       allocator_type
       get_allocator() const _GLIBCXX_NOEXCEPT
       { return allocator_type(_M_get_Bit_allocator()); }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       _Bvector_base() = default;
 #else
       _Bvector_base() { }
 #endif

+      _GLIBCXX20_CONSTEXPR
       _Bvector_base(const allocator_type& __a)
       : _M_impl(__a) { }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       _Bvector_base(_Bvector_base&&) = default;

+      _GLIBCXX20_CONSTEXPR
       _Bvector_base(_Bvector_base&& __x, const allocator_type& __a)
noexcept
       : _M_impl(_Bit_alloc_type(__a), std::move(__x._M_impl))
       { }
 #endif

+      _GLIBCXX20_CONSTEXPR
       ~_Bvector_base()
       { this->_M_deallocate(); }

     protected:
       _Bvector_impl _M_impl;

+      _GLIBCXX20_CONSTEXPR
       _Bit_pointer
       _M_allocate(size_t __n)
       { return _Bit_alloc_traits::allocate(_M_impl, _S_nword(__n)); }

+      _GLIBCXX20_CONSTEXPR
       void
       _M_deallocate()
       {
@@ -563,11 +632,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       void
       _M_move_data(_Bvector_base&& __x) noexcept
       { _M_impl._M_move_data(std::move(__x._M_impl)); }
 #endif

+      _GLIBCXX20_CONSTEXPR
       static size_t
       _S_nword(size_t __n)
       { return (__n + int(_S_word_bit) - 1) / int(_S_word_bit); }
@@ -629,6 +700,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       typedef std::reverse_iterator<iterator> reverse_iterator;
       typedef _Alloc allocator_type;

+      _GLIBCXX20_CONSTEXPR
       allocator_type
       get_allocator() const
       { return _Base::get_allocator(); }
@@ -641,21 +713,25 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

     public:
 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       vector() = default;
 #else
       vector() { }
 #endif

+      _GLIBCXX20_CONSTEXPR
       explicit
       vector(const allocator_type& __a)
       : _Base(__a) { }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       explicit
       vector(size_type __n, const allocator_type& __a = allocator_type())
       : vector(__n, false, __a)
       { }

+      _GLIBCXX20_CONSTEXPR
       vector(size_type __n, const bool& __value,
      const allocator_type& __a = allocator_type())
 #else
@@ -669,6 +745,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  _M_initialize_value(__value);
       }

+      _GLIBCXX20_CONSTEXPR
       vector(const vector& __x)
       :
_Base(_Bit_alloc_traits::_S_select_on_copy(__x._M_get_Bit_allocator()))
       {
@@ -677,13 +754,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       vector(vector&&) = default;

     private:
+      _GLIBCXX20_CONSTEXPR
       vector(vector&& __x, const allocator_type& __a, true_type) noexcept
       : _Base(std::move(__x), __a)
       { }

+      _GLIBCXX20_CONSTEXPR
       vector(vector&& __x, const allocator_type& __a, false_type)
       : _Base(__a)
       {
@@ -698,12 +778,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

     public:
+      _GLIBCXX20_CONSTEXPR
       vector(vector&& __x, const allocator_type& __a)
       noexcept(_Bit_alloc_traits::_S_always_equal())
       : vector(std::move(__x), __a,
        typename _Bit_alloc_traits::is_always_equal{})
       { }

+      _GLIBCXX20_CONSTEXPR
       vector(const vector& __x, const allocator_type& __a)
       : _Base(__a)
       {
@@ -711,6 +793,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  _M_copy_aligned(__x.begin(), __x.end(), begin());
       }

+      _GLIBCXX20_CONSTEXPR
       vector(initializer_list<bool> __l,
      const allocator_type& __a = allocator_type())
       : _Base(__a)
@@ -723,6 +806,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
+  _GLIBCXX20_CONSTEXPR
  vector(_InputIterator __first, _InputIterator __last,
        const allocator_type& __a = allocator_type())
  : _Base(__a)
@@ -742,8 +826,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  }
 #endif

+      _GLIBCXX20_CONSTEXPR
       ~vector() _GLIBCXX_NOEXCEPT { }

+      _GLIBCXX20_CONSTEXPR
       vector&
       operator=(const vector& __x)
       {
@@ -775,6 +861,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       vector&
       operator=(vector&& __x)
noexcept(_Bit_alloc_traits::_S_nothrow_move())
       {
@@ -800,6 +887,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  return *this;
       }

+      _GLIBCXX20_CONSTEXPR
       vector&
       operator=(initializer_list<bool> __l)
       {
@@ -812,6 +900,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       // versions: one that takes a count, and one that takes a range.
       // The range version is a member template, so we dispatch on whether
       // or not the type is an integer.
+      _GLIBCXX20_CONSTEXPR
       void
       assign(size_type __n, const bool& __x)
       { _M_fill_assign(__n, __x); }
@@ -819,6 +908,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
+  _GLIBCXX20_CONSTEXPR
  void
  assign(_InputIterator __first, _InputIterator __last)
  { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
@@ -834,65 +924,80 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       void
       assign(initializer_list<bool> __l)
       { _M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag()); }
 #endif

+      _GLIBCXX20_CONSTEXPR
       iterator
       begin() _GLIBCXX_NOEXCEPT
       { return iterator(this->_M_impl._M_start._M_p, 0); }

+      _GLIBCXX20_CONSTEXPR
       const_iterator
       begin() const _GLIBCXX_NOEXCEPT
       { return const_iterator(this->_M_impl._M_start._M_p, 0); }

+      _GLIBCXX20_CONSTEXPR
       iterator
       end() _GLIBCXX_NOEXCEPT
       { return this->_M_impl._M_finish; }

+      _GLIBCXX20_CONSTEXPR
       const_iterator
       end() const _GLIBCXX_NOEXCEPT
       { return this->_M_impl._M_finish; }

+      _GLIBCXX20_CONSTEXPR
       reverse_iterator
       rbegin() _GLIBCXX_NOEXCEPT
       { return reverse_iterator(end()); }

+      _GLIBCXX20_CONSTEXPR
       const_reverse_iterator
       rbegin() const _GLIBCXX_NOEXCEPT
       { return const_reverse_iterator(end()); }

+      _GLIBCXX20_CONSTEXPR
       reverse_iterator
       rend() _GLIBCXX_NOEXCEPT
       { return reverse_iterator(begin()); }

+      _GLIBCXX20_CONSTEXPR
       const_reverse_iterator
       rend() const _GLIBCXX_NOEXCEPT
       { return const_reverse_iterator(begin()); }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       const_iterator
       cbegin() const noexcept
       { return const_iterator(this->_M_impl._M_start._M_p, 0); }

+      _GLIBCXX20_CONSTEXPR
       const_iterator
       cend() const noexcept
       { return this->_M_impl._M_finish; }

+      _GLIBCXX20_CONSTEXPR
       const_reverse_iterator
       crbegin() const noexcept
       { return const_reverse_iterator(end()); }

+      _GLIBCXX20_CONSTEXPR
       const_reverse_iterator
       crend() const noexcept
       { return const_reverse_iterator(begin()); }
 #endif

+      _GLIBCXX20_CONSTEXPR
       size_type
       size() const _GLIBCXX_NOEXCEPT
       { return size_type(end() - begin()); }

+      _GLIBCXX20_CONSTEXPR
       size_type
       max_size() const _GLIBCXX_NOEXCEPT
       {
@@ -905,24 +1010,28 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  ? __asize * int(_S_word_bit) : __isize);
       }

+      _GLIBCXX20_CONSTEXPR
       size_type
       capacity() const _GLIBCXX_NOEXCEPT
       { return size_type(const_iterator(this->_M_impl._M_end_addr(), 0)
  - begin()); }

-      _GLIBCXX_NODISCARD bool
+      _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR bool
       empty() const _GLIBCXX_NOEXCEPT
       { return begin() == end(); }

+      _GLIBCXX20_CONSTEXPR
       reference
       operator[](size_type __n)
       { return begin()[__n]; }

+      _GLIBCXX20_CONSTEXPR
       const_reference
       operator[](size_type __n) const
       { return begin()[__n]; }

     protected:
+      _GLIBCXX20_CONSTEXPR
       void
       _M_range_check(size_type __n) const
       {
@@ -934,14 +1043,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

     public:
+      _GLIBCXX20_CONSTEXPR
       reference
       at(size_type __n)
       { _M_range_check(__n); return (*this)[__n]; }

+      _GLIBCXX20_CONSTEXPR
       const_reference
       at(size_type __n) const
       { _M_range_check(__n); return (*this)[__n]; }

+      _GLIBCXX20_CONSTEXPR
       void
       reserve(size_type __n)
       {
@@ -951,18 +1063,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   _M_reallocate(__n);
       }

+      _GLIBCXX20_CONSTEXPR
       reference
       front()
       { return *begin(); }

+      _GLIBCXX20_CONSTEXPR
       const_reference
       front() const
       { return *begin(); }

+      _GLIBCXX20_CONSTEXPR
       reference
       back()
       { return *(end() - 1); }

+      _GLIBCXX20_CONSTEXPR
       const_reference
       back() const
       { return *(end() - 1); }
@@ -972,9 +1088,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       // N.B. DR 464 says nothing about vector<bool> but we need something
       // here due to the way we are implementing DR 464 in the debug-mode
       // vector class.
+      _GLIBCXX20_CONSTEXPR
       void
       data() _GLIBCXX_NOEXCEPT { }

+      _GLIBCXX20_CONSTEXPR
       void
       push_back(bool __x)
       {
@@ -984,6 +1102,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   _M_insert_aux(end(), __x);
       }

+      _GLIBCXX20_CONSTEXPR
       void
       swap(vector& __x) _GLIBCXX_NOEXCEPT
       {
@@ -997,6 +1116,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

       // [23.2.5]/1, third-to-last entry in synopsis listing
+      _GLIBCXX20_CONSTEXPR
       static void
       swap(reference __x, reference __y) _GLIBCXX_NOEXCEPT
       {
@@ -1005,6 +1125,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  __y = __tmp;
       }

+      _GLIBCXX20_CONSTEXPR
       iterator
 #if __cplusplus >= 201103L
       insert(const_iterator __position, const bool& __x = bool())
@@ -1024,6 +1145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
+  _GLIBCXX20_CONSTEXPR
  iterator
  insert(const_iterator __position,
        _InputIterator __first, _InputIterator __last)
@@ -1047,6 +1169,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       iterator
       insert(const_iterator __position, size_type __n, const bool& __x)
       {
@@ -1061,15 +1184,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       iterator
       insert(const_iterator __p, initializer_list<bool> __l)
       { return this->insert(__p, __l.begin(), __l.end()); }
 #endif

+      _GLIBCXX20_CONSTEXPR
       void
       pop_back()
       { --this->_M_impl._M_finish; }

+      _GLIBCXX20_CONSTEXPR
       iterator
 #if __cplusplus >= 201103L
       erase(const_iterator __position)
@@ -1078,6 +1204,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif
       { return _M_erase(__position._M_const_cast()); }

+      _GLIBCXX20_CONSTEXPR
       iterator
 #if __cplusplus >= 201103L
       erase(const_iterator __first, const_iterator __last)
@@ -1086,6 +1213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif
       { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }

+      _GLIBCXX20_CONSTEXPR
       void
       resize(size_type __new_size, bool __x = bool())
       {
@@ -1096,11 +1224,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       void
       shrink_to_fit()
       { _M_shrink_to_fit(); }
 #endif

+      _GLIBCXX20_CONSTEXPR
       void
       flip() _GLIBCXX_NOEXCEPT
       {
@@ -1109,6 +1239,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   *__p = ~*__p;
       }

+      _GLIBCXX20_CONSTEXPR
       void
       clear() _GLIBCXX_NOEXCEPT
       { _M_erase_at_end(begin()); }
@@ -1116,6 +1247,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       template<typename... _Args>
 #if __cplusplus > 201402L
+  _GLIBCXX20_CONSTEXPR
  reference
 #else
  void
@@ -1129,6 +1261,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  }

       template<typename... _Args>
+  _GLIBCXX20_CONSTEXPR
  iterator
  emplace(const_iterator __pos, _Args&&... __args)
  { return insert(__pos, bool(__args...)); }
@@ -1136,6 +1269,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

     protected:
       // Precondition: __first._M_offset == 0 && __result._M_offset == 0.
+      _GLIBCXX20_CONSTEXPR
       iterator
       _M_copy_aligned(const_iterator __first, const_iterator __last,
       iterator __result)
@@ -1145,6 +1279,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  iterator(__q, 0));
       }

+      _GLIBCXX20_CONSTEXPR
       void
       _M_initialize(size_type __n)
       {
@@ -1158,6 +1293,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   }
       }

+      _GLIBCXX20_CONSTEXPR
       void
       _M_initialize_value(bool __x)
       {
@@ -1167,10 +1303,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    * sizeof(_Bit_type));
       }

+      _GLIBCXX20_CONSTEXPR
       void
       _M_reallocate(size_type __n);

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       bool
       _M_shrink_to_fit();
 #endif
@@ -1195,6 +1333,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif

       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_initialize_range(_InputIterator __first, _InputIterator __last,
     std::input_iterator_tag)
@@ -1204,6 +1343,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  }

       template<typename _ForwardIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
     std::forward_iterator_tag)
@@ -1228,6 +1368,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
 #endif

+      _GLIBCXX20_CONSTEXPR
       void
       _M_fill_assign(size_t __n, bool __x)
       {
@@ -1244,6 +1385,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_assign_aux(_InputIterator __first, _InputIterator __last,
       std::input_iterator_tag)
@@ -1258,6 +1400,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  }

       template<typename _ForwardIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
       std::forward_iterator_tag)
@@ -1292,10 +1435,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   std::__iterator_category(__first)); }
 #endif

+      _GLIBCXX20_CONSTEXPR
       void
       _M_fill_insert(iterator __position, size_type __n, bool __x);

       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_insert_range(iterator __pos, _InputIterator __first,
  _InputIterator __last, std::input_iterator_tag)
@@ -1308,13 +1453,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  }

       template<typename _ForwardIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_insert_range(iterator __position, _ForwardIterator __first,
  _ForwardIterator __last, std::forward_iterator_tag);

+      _GLIBCXX20_CONSTEXPR
       void
       _M_insert_aux(iterator __position, bool __x);

+      _GLIBCXX20_CONSTEXPR
       size_type
       _M_check_len(size_type __n, const char* __s) const
       {
@@ -1325,19 +1473,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  return (__len < size() || __len > max_size()) ? max_size() : __len;
       }

+      _GLIBCXX20_CONSTEXPR
       void
       _M_erase_at_end(iterator __pos)
       { this->_M_impl._M_finish = __pos; }

+      _GLIBCXX20_CONSTEXPR
       iterator
       _M_erase(iterator __pos);

+      _GLIBCXX20_CONSTEXPR
       iterator
       _M_erase(iterator __first, iterator __last);
   };

 _GLIBCXX_END_NAMESPACE_CONTAINER

+  _GLIBCXX20_CONSTEXPR
   inline void
   __fill_bvector(_GLIBCXX_STD_C::_Bit_type * __v,
  unsigned int __first, unsigned int __last, bool __x)
@@ -1354,6 +1506,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
       *__v &= ~__mask;
   }

+  _GLIBCXX20_CONSTEXPR
   inline void
   __fill_a1(_GLIBCXX_STD_C::_Bit_iterator __first,
     _GLIBCXX_STD_C::_Bit_iterator __last, const bool& __x)
@@ -1383,6 +1536,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
     struct hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>
     : public __hash_base<size_t, _GLIBCXX_STD_C::vector<bool, _Alloc>>
     {
+      _GLIBCXX20_CONSTEXPR
       size_t
       operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>&) const
noexcept;
     };
diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h
b/libstdc++-v3/include/bits/stl_uninitialized.h
index a3ccb72078b..c2d5ef36549 100644
--- a/libstdc++-v3/include/bits/stl_uninitialized.h
+++ b/libstdc++-v3/include/bits/stl_uninitialized.h
@@ -225,7 +225,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __uninitialized_fill_n
     {
       template<typename _ForwardIterator, typename _Size, typename _Tp>
-        static _ForwardIterator
+        static _GLIBCXX20_CONSTEXPR _ForwardIterator
         __uninit_fill_n(_ForwardIterator __first, _Size __n,
  const _Tp& __x)
         {
@@ -248,7 +248,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __uninitialized_fill_n<true>
     {
       template<typename _ForwardIterator, typename _Size, typename _Tp>
-        static _ForwardIterator
+        static _GLIBCXX20_CONSTEXPR _ForwardIterator
         __uninit_fill_n(_ForwardIterator __first, _Size __n,
  const _Tp& __x)
         { return std::fill_n(__first, __n, __x); }
@@ -268,7 +268,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
    *  Like fill_n(), but does not require an initialized output range.
   */
   template<typename _ForwardIterator, typename _Size, typename _Tp>
-    inline _ForwardIterator
+    inline _GLIBCXX20_CONSTEXPR _ForwardIterator
     uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp&
__x)
     {
       typedef typename iterator_traits<_ForwardIterator>::value_type
@@ -382,6 +382,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION

   template<typename _ForwardIterator, typename _Size, typename _Tp,
    typename _Allocator>
+     _GLIBCXX20_CONSTEXPR
     _ForwardIterator
     __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
      const _Tp& __x, _Allocator& __alloc)
@@ -403,7 +404,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION

   template<typename _ForwardIterator, typename _Size, typename _Tp,
    typename _Tp2>
-    inline _ForwardIterator
+    inline _GLIBCXX20_CONSTEXPR _ForwardIterator
     __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
      const _Tp& __x, allocator<_Tp2>&)
     { return std::uninitialized_fill_n(__first, __n, __x); }
diff --git a/libstdc++-v3/include/bits/stl_vector.h
b/libstdc++-v3/include/bits/stl_vector.h
index d3f1b1fae5c..952f140fa0a 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -94,17 +94,20 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  pointer _M_finish;
  pointer _M_end_of_storage;

+  _GLIBCXX20_CONSTEXPR
  _Vector_impl_data() _GLIBCXX_NOEXCEPT
  : _M_start(), _M_finish(), _M_end_of_storage()
  { }

 #if __cplusplus >= 201103L
+  _GLIBCXX20_CONSTEXPR
  _Vector_impl_data(_Vector_impl_data&& __x) noexcept
  : _M_start(__x._M_start), _M_finish(__x._M_finish),
   _M_end_of_storage(__x._M_end_of_storage)
  { __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
 #endif

+  _GLIBCXX20_CONSTEXPR
  void
  _M_copy_data(_Vector_impl_data const& __x) _GLIBCXX_NOEXCEPT
  {
@@ -113,6 +116,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   _M_end_of_storage = __x._M_end_of_storage;
  }

+  _GLIBCXX20_CONSTEXPR
  void
  _M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
  {
@@ -128,11 +132,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       struct _Vector_impl
  : public _Tp_alloc_type, public _Vector_impl_data
       {
+  _GLIBCXX20_CONSTEXPR
  _Vector_impl() _GLIBCXX_NOEXCEPT_IF(
     is_nothrow_default_constructible<_Tp_alloc_type>::value)
  : _Tp_alloc_type()
  { }

+  _GLIBCXX20_CONSTEXPR
  _Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
  : _Tp_alloc_type(__a)
  { }
@@ -140,14 +146,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
  // Not defaulted, to enforce noexcept(true) even when
  // !is_nothrow_move_constructible<_Tp_alloc_type>.
+  _GLIBCXX20_CONSTEXPR
  _Vector_impl(_Vector_impl&& __x) noexcept
  : _Tp_alloc_type(std::move(__x)), _Vector_impl_data(std::move(__x))
  { }

+  _GLIBCXX20_CONSTEXPR
  _Vector_impl(_Tp_alloc_type&& __a) noexcept
  : _Tp_alloc_type(std::move(__a))
  { }

+  _GLIBCXX20_CONSTEXPR
  _Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
  : _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv))
  { }
@@ -160,15 +169,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
       ::size_type size_type;

-    static void _S_shrink(_Vector_impl&, size_type) { }
-    static void _S_on_dealloc(_Vector_impl&) { }
+    static _GLIBCXX20_CONSTEXPR void _S_shrink(_Vector_impl&, size_type) {
}
+    static _GLIBCXX20_CONSTEXPR void _S_on_dealloc(_Vector_impl&) { }

     typedef _Vector_impl& _Reinit;

     struct _Grow
     {
-      _Grow(_Vector_impl&, size_type) { }
-      void _M_grew(size_type) { }
+      _GLIBCXX20_CONSTEXPR _Grow(_Vector_impl&, size_type) { }
+      _GLIBCXX20_CONSTEXPR void _M_grew(size_type) { }
     };
   };

@@ -181,22 +190,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

     // Adjust ASan annotation for [_M_start, _M_end_of_storage) to
     // mark end of valid region as __curr instead of __prev.
-    static void
+    static _GLIBCXX20_CONSTEXPR void
     _S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
     {
       __sanitizer_annotate_contiguous_container(__impl._M_start,
   __impl._M_end_of_storage, __prev, __curr);
     }

-    static void
+    static _GLIBCXX20_CONSTEXPR void
     _S_grow(_Vector_impl& __impl, size_type __n)
     { _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }

-    static void
+    static _GLIBCXX20_CONSTEXPR void
     _S_shrink(_Vector_impl& __impl, size_type __n)
     { _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }

-    static void
+    static _GLIBCXX20_CONSTEXPR void
     _S_on_dealloc(_Vector_impl& __impl)
     {
       if (__impl._M_start)
@@ -206,13 +215,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     // Used on reallocation to tell ASan unused capacity is invalid.
     struct _Reinit
     {
-      explicit _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
+      explicit _GLIBCXX20_CONSTEXPR _Reinit(_Vector_impl& __impl) :
_M_impl(__impl)
       {
  // Mark unused capacity as valid again before deallocating it.
  _S_on_dealloc(_M_impl);
       }

-      ~_Reinit()
+      _GLIBCXX20_CONSTEXPR ~_Reinit()
       {
  // Mark unused capacity as invalid after reallocation.
  if (_M_impl._M_start)
@@ -223,25 +232,28 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       _Vector_impl& _M_impl;

 #if __cplusplus >= 201103L
-      _Reinit(const _Reinit&) = delete;
-      _Reinit& operator=(const _Reinit&) = delete;
+      _GLIBCXX20_CONSTEXPR _Reinit(const _Reinit&) = delete;
+      _GLIBCXX20_CONSTEXPR _Reinit& operator=(const _Reinit&) = delete;
 #endif
     };

     // Tell ASan when unused capacity is initialized to be valid.
     struct _Grow
     {
+        _GLIBCXX20_CONSTEXPR
       _Grow(_Vector_impl& __impl, size_type __n)
       : _M_impl(__impl), _M_n(__n)
       { _S_grow(_M_impl, __n); }

+        _GLIBCXX20_CONSTEXPR
       ~_Grow() { if (_M_n) _S_shrink(_M_impl, _M_n); }

+        _GLIBCXX20_CONSTEXPR
       void _M_grew(size_type __n) { _M_n -= __n; }

 #if __cplusplus >= 201103L
-      _Grow(const _Grow&) = delete;
-      _Grow& operator=(const _Grow&) = delete;
+      _GLIBCXX20_CONSTEXPR _Grow(const _Grow&) = delete;
+      _GLIBCXX20_CONSTEXPR _Grow& operator=(const _Grow&) = delete;
 #endif
     private:
       _Vector_impl& _M_impl;
@@ -272,46 +284,54 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     public:
       typedef _Alloc allocator_type;

+      _GLIBCXX20_CONSTEXPR
       _Tp_alloc_type&
       _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
       { return this->_M_impl; }

-      const _Tp_alloc_type&
+      const _GLIBCXX20_CONSTEXPR _Tp_alloc_type&
       _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
       { return this->_M_impl; }

+      _GLIBCXX20_CONSTEXPR
       allocator_type
       get_allocator() const _GLIBCXX_NOEXCEPT
       { return allocator_type(_M_get_Tp_allocator()); }

 #if __cplusplus >= 201103L
-      _Vector_base() = default;
+      _GLIBCXX20_CONSTEXPR _Vector_base() = default;
 #else
       _Vector_base() { }
 #endif

+      _GLIBCXX20_CONSTEXPR
       _Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
       : _M_impl(__a) { }

       // Kept for ABI compatibility.
 #if !_GLIBCXX_INLINE_VERSION
+      _GLIBCXX20_CONSTEXPR
       _Vector_base(size_t __n)
       : _M_impl()
       { _M_create_storage(__n); }
 #endif

+      _GLIBCXX20_CONSTEXPR
       _Vector_base(size_t __n, const allocator_type& __a)
       : _M_impl(__a)
       { _M_create_storage(__n); }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       _Vector_base(_Vector_base&&) = default;

       // Kept for ABI compatibility.
 # if !_GLIBCXX_INLINE_VERSION
+      _GLIBCXX20_CONSTEXPR
       _Vector_base(_Tp_alloc_type&& __a) noexcept
       : _M_impl(std::move(__a)) { }

+      _GLIBCXX20_CONSTEXPR
       _Vector_base(_Vector_base&& __x, const allocator_type& __a)
       : _M_impl(__a)
       {
@@ -325,11 +345,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }
 # endif

+      _GLIBCXX20_CONSTEXPR
       _Vector_base(const allocator_type& __a, _Vector_base&& __x)
       : _M_impl(_Tp_alloc_type(__a), std::move(__x._M_impl))
       { }
 #endif

+      _GLIBCXX20_CONSTEXPR
       ~_Vector_base() _GLIBCXX_NOEXCEPT
       {
  _M_deallocate(_M_impl._M_start,
@@ -339,6 +361,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     public:
       _Vector_impl _M_impl;

+      _GLIBCXX20_CONSTEXPR
       pointer
       _M_allocate(size_t __n)
       {
@@ -346,6 +369,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
       }

+      _GLIBCXX20_CONSTEXPR
       void
       _M_deallocate(pointer __p, size_t __n)
       {
@@ -355,6 +379,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

     protected:
+      _GLIBCXX20_CONSTEXPR
       void
       _M_create_storage(size_t __n)
       {
@@ -449,19 +474,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
       }

-      static pointer
+      static _GLIBCXX20_CONSTEXPR 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
+      static _GLIBCXX20_CONSTEXPR pointer
       _S_do_relocate(pointer, pointer, pointer __result,
      _Tp_alloc_type&, false_type) noexcept
       { return __result; }

-      static pointer
+      static _GLIBCXX20_CONSTEXPR pointer
       _S_relocate(pointer __first, pointer __last, pointer __result,
   _Tp_alloc_type& __alloc) noexcept
       {
@@ -484,7 +509,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  @brief  Creates a %vector with no elements.
        */
 #if __cplusplus >= 201103L
-      vector() = default;
+      _GLIBCXX20_CONSTEXPR vector() = default;
 #else
       vector() { }
 #endif
@@ -494,6 +519,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  @param  __a  An allocator object.
        */
       explicit
+      _GLIBCXX20_CONSTEXPR
       vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT
       : _Base(__a) { }

@@ -507,6 +533,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  constructed elements.
        */
       explicit
+      _GLIBCXX20_CONSTEXPR
       vector(size_type __n, const allocator_type& __a = allocator_type())
       : _Base(_S_check_init_len(__n, __a), __a)
       { _M_default_initialize(__n); }
@@ -519,6 +546,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *
        *  This constructor fills the %vector with @a __n copies of @a
__value.
        */
+      _GLIBCXX20_CONSTEXPR
       vector(size_type __n, const value_type& __value,
      const allocator_type& __a = allocator_type())
       : _Base(_S_check_init_len(__n, __a), __a)
@@ -550,6 +578,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  The newly-created %vector uses a copy of the allocator object
used
        *  by @a __x (unless the allocator traits dictate a different
object).
        */
+      _GLIBCXX20_CONSTEXPR
       vector(const vector& __x)
       : _Base(__x.size(),
  _Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
@@ -569,9 +598,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  The contents of the moved instance are a valid, but unspecified
        *  %vector.
        */
+      _GLIBCXX20_CONSTEXPR
       vector(vector&&) noexcept = default;

       /// Copy constructor with alternative allocator
+      _GLIBCXX20_CONSTEXPR
       vector(const vector& __x, const allocator_type& __a)
       : _Base(__x.size(), __a)
       {
@@ -582,10 +613,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

     private:
+      _GLIBCXX20_CONSTEXPR
       vector(vector&& __rv, const allocator_type& __m, true_type) noexcept
       : _Base(__m, std::move(__rv))
       { }

+      _GLIBCXX20_CONSTEXPR
       vector(vector&& __rv, const allocator_type& __m, false_type)
       : _Base(__m)
       {
@@ -604,6 +637,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

     public:
       /// Move constructor with alternative allocator
+      _GLIBCXX20_CONSTEXPR
       vector(vector&& __rv, const allocator_type& __m)
       noexcept( noexcept(
  vector(std::declval<vector&&>(), std::declval<const allocator_type&>(),
@@ -622,6 +656,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  This will call the element type's copy constructor N times
        *  (where N is @a __l.size()) and do no memory reallocation.
        */
+      _GLIBCXX20_CONSTEXPR
       vector(initializer_list<value_type> __l,
      const allocator_type& __a = allocator_type())
       : _Base(__a)
@@ -650,6 +685,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
+  _GLIBCXX20_CONSTEXPR
  vector(_InputIterator __first, _InputIterator __last,
        const allocator_type& __a = allocator_type())
  : _Base(__a)
@@ -675,6 +711,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  not touched in any way.  Managing the pointer is the user's
        *  responsibility.
        */
+      _GLIBCXX20_CONSTEXPR
       ~vector() _GLIBCXX_NOEXCEPT
       {
  std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
@@ -691,6 +728,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *
        *  Whether the allocator is copied depends on the allocator traits.
        */
+      _GLIBCXX20_CONSTEXPR
       vector&
       operator=(const vector& __x);

@@ -705,6 +743,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *
        *  Whether the allocator is moved depends on the allocator traits.
        */
+      _GLIBCXX20_CONSTEXPR
       vector&
       operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
       {
@@ -726,6 +765,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  that the resulting %vector's size is the same as the number
        *  of elements assigned.
        */
+      _GLIBCXX20_CONSTEXPR
       vector&
       operator=(initializer_list<value_type> __l)
       {
@@ -745,6 +785,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  %vector and that the resulting %vector's size is the same as
        *  the number of elements assigned.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       assign(size_type __n, const value_type& __val)
       { _M_fill_assign(__n, __val); }
@@ -764,6 +805,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
+  _GLIBCXX20_CONSTEXPR
  void
  assign(_InputIterator __first, _InputIterator __last)
  { _M_assign_dispatch(__first, __last, __false_type()); }
@@ -790,6 +832,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  that the resulting %vector's size is the same as the number
        *  of elements assigned.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       assign(initializer_list<value_type> __l)
       {
@@ -807,6 +850,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  element in the %vector.  Iteration is done in ordinary
        *  element order.
        */
+      _GLIBCXX20_CONSTEXPR
       iterator
       begin() _GLIBCXX_NOEXCEPT
       { return iterator(this->_M_impl._M_start); }
@@ -816,6 +860,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  first element in the %vector.  Iteration is done in ordinary
        *  element order.
        */
+      _GLIBCXX20_CONSTEXPR
       const_iterator
       begin() const _GLIBCXX_NOEXCEPT
       { return const_iterator(this->_M_impl._M_start); }
@@ -825,6 +870,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  element in the %vector.  Iteration is done in ordinary
        *  element order.
        */
+      _GLIBCXX20_CONSTEXPR
       iterator
       end() _GLIBCXX_NOEXCEPT
       { return iterator(this->_M_impl._M_finish); }
@@ -834,6 +880,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  the last element in the %vector.  Iteration is done in
        *  ordinary element order.
        */
+      _GLIBCXX20_CONSTEXPR
       const_iterator
       end() const _GLIBCXX_NOEXCEPT
       { return const_iterator(this->_M_impl._M_finish); }
@@ -843,6 +890,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  last element in the %vector.  Iteration is done in reverse
        *  element order.
        */
+      _GLIBCXX20_CONSTEXPR
       reverse_iterator
       rbegin() _GLIBCXX_NOEXCEPT
       { return reverse_iterator(end()); }
@@ -852,6 +900,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  to the last element in the %vector.  Iteration is done in
        *  reverse element order.
        */
+      _GLIBCXX20_CONSTEXPR
       const_reverse_iterator
       rbegin() const _GLIBCXX_NOEXCEPT
       { return const_reverse_iterator(end()); }
@@ -861,6 +910,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  before the first element in the %vector.  Iteration is done
        *  in reverse element order.
        */
+      _GLIBCXX20_CONSTEXPR
       reverse_iterator
       rend() _GLIBCXX_NOEXCEPT
       { return reverse_iterator(begin()); }
@@ -870,6 +920,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  to one before the first element in the %vector.  Iteration
        *  is done in reverse element order.
        */
+      _GLIBCXX20_CONSTEXPR
       const_reverse_iterator
       rend() const _GLIBCXX_NOEXCEPT
       { return const_reverse_iterator(begin()); }
@@ -880,6 +931,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  first element in the %vector.  Iteration is done in ordinary
        *  element order.
        */
+      _GLIBCXX20_CONSTEXPR
       const_iterator
       cbegin() const noexcept
       { return const_iterator(this->_M_impl._M_start); }
@@ -889,6 +941,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  the last element in the %vector.  Iteration is done in
        *  ordinary element order.
        */
+      _GLIBCXX20_CONSTEXPR
       const_iterator
       cend() const noexcept
       { return const_iterator(this->_M_impl._M_finish); }
@@ -898,6 +951,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  to the last element in the %vector.  Iteration is done in
        *  reverse element order.
        */
+      _GLIBCXX20_CONSTEXPR
       const_reverse_iterator
       crbegin() const noexcept
       { return const_reverse_iterator(end()); }
@@ -907,6 +961,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  to one before the first element in the %vector.  Iteration
        *  is done in reverse element order.
        */
+      _GLIBCXX20_CONSTEXPR
       const_reverse_iterator
       crend() const noexcept
       { return const_reverse_iterator(begin()); }
@@ -914,11 +969,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // [23.2.4.2] capacity
       /**  Returns the number of elements in the %vector.  */
+      _GLIBCXX20_CONSTEXPR
       size_type
       size() const _GLIBCXX_NOEXCEPT
       { return size_type(this->_M_impl._M_finish -
this->_M_impl._M_start); }

       /**  Returns the size() of the largest possible %vector.  */
+      _GLIBCXX20_CONSTEXPR
       size_type
       max_size() const _GLIBCXX_NOEXCEPT
       { return _S_max_size(_M_get_Tp_allocator()); }
@@ -933,6 +990,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  %vector's current size the %vector is truncated, otherwise
        *  default constructed elements are appended.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       resize(size_type __new_size)
       {
@@ -953,6 +1011,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  the %vector is extended and new elements are populated with
        *  given data.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       resize(size_type __new_size, const value_type& __x)
       {
@@ -973,6 +1032,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  the %vector is extended and new elements are populated with
        *  given data.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       resize(size_type __new_size, value_type __x = value_type())
       {
@@ -985,6 +1045,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

 #if __cplusplus >= 201103L
       /**  A non-binding request to reduce capacity() to size().  */
+      _GLIBCXX20_CONSTEXPR
       void
       shrink_to_fit()
       { _M_shrink_to_fit(); }
@@ -994,6 +1055,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  Returns the total number of elements that the %vector can
        *  hold before needing to allocate more memory.
        */
+      _GLIBCXX20_CONSTEXPR
       size_type
       capacity() const _GLIBCXX_NOEXCEPT
       { return size_type(this->_M_impl._M_end_of_storage
@@ -1003,6 +1065,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  Returns true if the %vector is empty.  (Thus begin() would
        *  equal end().)
        */
+      _GLIBCXX20_CONSTEXPR
       _GLIBCXX_NODISCARD bool
       empty() const _GLIBCXX_NOEXCEPT
       { return begin() == end(); }
@@ -1024,6 +1087,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  %advance, and thus prevent a possible reallocation of memory
        *  and copying of %vector data.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       reserve(size_type __n);

@@ -1039,6 +1103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  out_of_range lookups are not defined. (For checked lookups
        *  see at().)
        */
+      _GLIBCXX20_CONSTEXPR
       reference
       operator[](size_type __n) _GLIBCXX_NOEXCEPT
       {
@@ -1057,6 +1122,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  out_of_range lookups are not defined. (For checked lookups
        *  see at().)
        */
+      _GLIBCXX20_CONSTEXPR
       const_reference
       operator[](size_type __n) const _GLIBCXX_NOEXCEPT
       {
@@ -1066,6 +1132,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

     protected:
       /// Safety check used only from at().
+      _GLIBCXX20_CONSTEXPR
       void
       _M_range_check(size_type __n) const
       {
@@ -1088,6 +1155,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  is first checked that it is in the range of the vector.  The
        *  function throws out_of_range if the check fails.
        */
+      _GLIBCXX20_CONSTEXPR
       reference
       at(size_type __n)
       {
@@ -1106,6 +1174,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  is first checked that it is in the range of the vector.  The
        *  function throws out_of_range if the check fails.
        */
+      _GLIBCXX20_CONSTEXPR
       const_reference
       at(size_type __n) const
       {
@@ -1117,6 +1186,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  Returns a read/write reference to the data at the first
        *  element of the %vector.
        */
+      _GLIBCXX20_CONSTEXPR
       reference
       front() _GLIBCXX_NOEXCEPT
       {
@@ -1128,6 +1198,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  Returns a read-only (constant) reference to the data at the first
        *  element of the %vector.
        */
+      _GLIBCXX20_CONSTEXPR
       const_reference
       front() const _GLIBCXX_NOEXCEPT
       {
@@ -1139,6 +1210,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  Returns a read/write reference to the data at the last
        *  element of the %vector.
        */
+      _GLIBCXX20_CONSTEXPR
       reference
       back() _GLIBCXX_NOEXCEPT
       {
@@ -1150,6 +1222,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  Returns a read-only (constant) reference to the data at the
        *  last element of the %vector.
        */
+      _GLIBCXX20_CONSTEXPR
       const_reference
       back() const _GLIBCXX_NOEXCEPT
       {
@@ -1164,10 +1237,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *   Returns a pointer such that [data(), data() + size()) is a valid
        *   range.  For a non-empty %vector, data() == &front().
        */
+      _GLIBCXX20_CONSTEXPR
       _Tp*
       data() _GLIBCXX_NOEXCEPT
       { return _M_data_ptr(this->_M_impl._M_start); }

+      _GLIBCXX20_CONSTEXPR
       const _Tp*
       data() const _GLIBCXX_NOEXCEPT
       { return _M_data_ptr(this->_M_impl._M_start); }
@@ -1183,6 +1258,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  done in constant time if the %vector has preallocated space
        *  available.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       push_back(const value_type& __x)
       {
@@ -1199,12 +1275,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

 #if __cplusplus >= 201103L
+      _GLIBCXX20_CONSTEXPR
       void
       push_back(value_type&& __x)
       { emplace_back(std::move(__x)); }

       template<typename... _Args>
 #if __cplusplus > 201402L
+  _GLIBCXX20_CONSTEXPR
  reference
 #else
  void
@@ -1221,6 +1299,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  data is needed, it should be retrieved before pop_back() is
        *  called.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       pop_back() _GLIBCXX_NOEXCEPT
       {
@@ -1244,6 +1323,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  std::list.
        */
       template<typename... _Args>
+  _GLIBCXX20_CONSTEXPR
  iterator
  emplace(const_iterator __position, _Args&&... __args)
  { return _M_emplace_aux(__position, std::forward<_Args>(__args)...); }
@@ -1259,6 +1339,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  could be expensive for a %vector and if it is frequently
        *  used the user should consider using std::list.
        */
+      _GLIBCXX20_CONSTEXPR
       iterator
       insert(const_iterator __position, const value_type& __x);
 #else
@@ -1289,6 +1370,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  could be expensive for a %vector and if it is frequently
        *  used the user should consider using std::list.
        */
+      _GLIBCXX20_CONSTEXPR
       iterator
       insert(const_iterator __position, value_type&& __x)
       { return _M_insert_rval(__position, std::move(__x)); }
@@ -1306,6 +1388,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  %vector and if it is frequently used the user should
        *  consider using std::list.
        */
+      _GLIBCXX20_CONSTEXPR
       iterator
       insert(const_iterator __position, initializer_list<value_type> __l)
       {
@@ -1331,6 +1414,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  %vector and if it is frequently used the user should
        *  consider using std::list.
        */
+      _GLIBCXX20_CONSTEXPR
       iterator
       insert(const_iterator __position, size_type __n, const value_type&
__x)
       {
@@ -1375,6 +1459,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        */
       template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
+  _GLIBCXX20_CONSTEXPR
  iterator
  insert(const_iterator __position, _InputIterator __first,
        _InputIterator __last)
@@ -1400,6 +1485,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  consider using std::list.
        */
       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  insert(iterator __position, _InputIterator __first,
        _InputIterator __last)
@@ -1425,6 +1511,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  the pointed-to memory is not touched in any way.  Managing
        *  the pointer is the user's responsibility.
        */
+      _GLIBCXX20_CONSTEXPR
       iterator
 #if __cplusplus >= 201103L
       erase(const_iterator __position)
@@ -1452,6 +1539,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  pointers, the pointed-to memory is not touched in any way.
        *  Managing the pointer is the user's responsibility.
        */
+      _GLIBCXX20_CONSTEXPR
       iterator
 #if __cplusplus >= 201103L
       erase(const_iterator __first, const_iterator __last)
@@ -1476,6 +1564,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *
        *  Whether the allocators are swapped depends on the allocator
traits.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       swap(vector& __x) _GLIBCXX_NOEXCEPT
       {
@@ -1494,6 +1583,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  pointed-to memory is not touched in any way.  Managing the
pointer is
        *  the user's responsibility.
        */
+      _GLIBCXX20_CONSTEXPR
       void
       clear() _GLIBCXX_NOEXCEPT
       { _M_erase_at_end(this->_M_impl._M_start); }
@@ -1504,6 +1594,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  obtain @a n bytes of memory, and then copies [first,last) into
it.
        */
       template<typename _ForwardIterator>
+  _GLIBCXX20_CONSTEXPR
  pointer
  _M_allocate_and_copy(size_type __n,
      _ForwardIterator __first, _ForwardIterator __last)
@@ -1531,6 +1622,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 438. Ambiguity in the "do the right thing" clause
       template<typename _Integer>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
  {
@@ -1543,6 +1635,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Called by the range constructor to implement [23.1.1]/9
       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
        __false_type)
@@ -1554,6 +1647,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Called by the second initialize_dispatch above
       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_range_initialize(_InputIterator __first, _InputIterator __last,
     std::input_iterator_tag)
@@ -1573,6 +1667,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Called by the second initialize_dispatch above
       template<typename _ForwardIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
     std::forward_iterator_tag)
@@ -1589,6 +1684,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Called by the first initialize_dispatch above and by the
       // vector(n,value,a) constructor.
+      _GLIBCXX20_CONSTEXPR
       void
       _M_fill_initialize(size_type __n, const value_type& __value)
       {
@@ -1599,6 +1695,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

 #if __cplusplus >= 201103L
       // Called by the vector(n) constructor.
+      _GLIBCXX20_CONSTEXPR
       void
       _M_default_initialize(size_type __n)
       {
@@ -1616,12 +1713,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 438. Ambiguity in the "do the right thing" clause
       template<typename _Integer>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
  { _M_fill_assign(__n, __val); }

       // Called by the range assign to implement [23.1.1]/9
       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
    __false_type)
@@ -1629,18 +1728,21 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Called by the second assign_dispatch above
       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_assign_aux(_InputIterator __first, _InputIterator __last,
       std::input_iterator_tag);

       // Called by the second assign_dispatch above
       template<typename _ForwardIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
       std::forward_iterator_tag);

       // Called by assign(n,t), and the range assign when it turns out
       // to be the same thing.
+      _GLIBCXX20_CONSTEXPR
       void
       _M_fill_assign(size_type __n, const value_type& __val);

@@ -1651,6 +1753,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 438. Ambiguity in the "do the right thing" clause
       template<typename _Integer>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
    __true_type)
@@ -1658,6 +1761,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Called by the range insert to implement [23.1.1]/9
       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_insert_dispatch(iterator __pos, _InputIterator __first,
    _InputIterator __last, __false_type)
@@ -1668,26 +1772,31 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Called by the second insert_dispatch above
       template<typename _InputIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_range_insert(iterator __pos, _InputIterator __first,
  _InputIterator __last, std::input_iterator_tag);

       // Called by the second insert_dispatch above
       template<typename _ForwardIterator>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_range_insert(iterator __pos, _ForwardIterator __first,
  _ForwardIterator __last, std::forward_iterator_tag);

       // Called by insert(p,n,x), and the range insert when it turns out
to be
       // the same thing.
+      _GLIBCXX20_CONSTEXPR
       void
       _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);

 #if __cplusplus >= 201103L
       // Called by resize(n).
+      _GLIBCXX20_CONSTEXPR
       void
       _M_default_append(size_type __n);

+      _GLIBCXX20_CONSTEXPR
       bool
       _M_shrink_to_fit();
 #endif
@@ -1706,19 +1815,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       {
  template<typename... _Args>
   explicit
+    _GLIBCXX20_CONSTEXPR
   _Temporary_value(vector* __vec, _Args&&... __args) : _M_this(__vec)
   {
     _Alloc_traits::construct(_M_this->_M_impl, _M_ptr(),
      std::forward<_Args>(__args)...);
   }

+  _GLIBCXX20_CONSTEXPR
  ~_Temporary_value()
  { _Alloc_traits::destroy(_M_this->_M_impl, _M_ptr()); }

+  _GLIBCXX20_CONSTEXPR
  value_type&
  _M_val() { return *_M_ptr(); }

       private:
+  _GLIBCXX20_CONSTEXPR
  _Tp*
  _M_ptr() { return reinterpret_cast<_Tp*>(&__buf); }

@@ -1729,29 +1842,35 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       // Called by insert(p,x) and other functions when insertion needs to
       // reallocate or move existing elements. _Arg is either _Tp& or _Tp.
       template<typename _Arg>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_insert_aux(iterator __position, _Arg&& __arg);

       template<typename... _Args>
+  _GLIBCXX20_CONSTEXPR
  void
  _M_realloc_insert(iterator __position, _Args&&... __args);

       // Either move-construct at the end, or forward to _M_insert_aux.
+      _GLIBCXX20_CONSTEXPR
       iterator
       _M_insert_rval(const_iterator __position, value_type&& __v);

       // Try to emplace at the end, otherwise forward to _M_insert_aux.
       template<typename... _Args>
+  _GLIBCXX20_CONSTEXPR
  iterator
  _M_emplace_aux(const_iterator __position, _Args&&... __args);

       // Emplacing an rvalue of the correct type can use _M_insert_rval.
+      _GLIBCXX20_CONSTEXPR
       iterator
       _M_emplace_aux(const_iterator __position, value_type&& __v)
       { return _M_insert_rval(__position, std::move(__v)); }
 #endif

       // Called by _M_fill_insert, _M_insert_aux etc.
+      _GLIBCXX20_CONSTEXPR
       size_type
       _M_check_len(size_type __n, const char* __s) const
       {
@@ -1763,7 +1882,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

       // Called by constructors to check initial size.
-      static size_type
+      static _GLIBCXX20_CONSTEXPR size_type
       _S_check_init_len(size_type __n, const allocator_type& __a)
       {
  if (__n > _S_max_size(_Tp_alloc_type(__a)))
@@ -1772,7 +1891,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
  return __n;
       }

-      static size_type
+      static _GLIBCXX20_CONSTEXPR size_type
       _S_max_size(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
       {
  // std::distance(begin(), end()) cannot be greater than PTRDIFF_MAX,
@@ -1788,6 +1907,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
       // _M_assign_aux.
+      _GLIBCXX20_CONSTEXPR
       void
       _M_erase_at_end(pointer __pos) _GLIBCXX_NOEXCEPT
       {
@@ -1800,9 +1920,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   }
       }

+      _GLIBCXX20_CONSTEXPR
       iterator
       _M_erase(iterator __position);

+      _GLIBCXX20_CONSTEXPR
       iterator
       _M_erase(iterator __first, iterator __last);

@@ -1811,6 +1933,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       // Constant-time move assignment when source object's memory can be
       // moved, either because the source's allocator will move too
       // or because the allocators are equal.
+      _GLIBCXX20_CONSTEXPR
       void
       _M_move_assign(vector&& __x, true_type) noexcept
       {
@@ -1822,6 +1945,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

       // Do move assignment when it might not be possible to move source
       // object's memory, resulting in a linear-time operation.
+      _GLIBCXX20_CONSTEXPR
       void
       _M_move_assign(vector&& __x, false_type)
       {
@@ -1840,12 +1964,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif

       template<typename _Up>
+  _GLIBCXX20_CONSTEXPR
  _Up*
  _M_data_ptr(_Up* __ptr) const _GLIBCXX_NOEXCEPT
  { return __ptr; }

 #if __cplusplus >= 201103L
       template<typename _Ptr>
+  _GLIBCXX20_CONSTEXPR
  typename std::pointer_traits<_Ptr>::element_type*
  _M_data_ptr(_Ptr __ptr) const
  { return empty() ? nullptr : std::__to_address(__ptr); }
@@ -1888,7 +2014,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  and if corresponding elements compare equal.
   */
   template<typename _Tp, typename _Alloc>
-    inline bool
+    inline _GLIBCXX20_CONSTEXPR bool
     operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
__y)
     { return (__x.size() == __y.size()
       && std::equal(__x.begin(), __x.end(), __y.begin())); }
@@ -1906,7 +2032,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  `<` and `>=` etc.
   */
   template<typename _Tp, typename _Alloc>
-    inline __detail::__synth3way_t<_Tp>
+    inline _GLIBCXX20_CONSTEXPR __detail::__synth3way_t<_Tp>
     operator<=>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
__y)
     {
       return std::lexicographical_compare_three_way(__x.begin(), __x.end(),
@@ -1926,39 +2052,39 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  See std::lexicographical_compare() for how the determination is made.
   */
   template<typename _Tp, typename _Alloc>
-    inline bool
+    inline _GLIBCXX20_CONSTEXPR bool
     operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
__y)
     { return std::lexicographical_compare(__x.begin(), __x.end(),
   __y.begin(), __y.end()); }

   /// Based on operator==
   template<typename _Tp, typename _Alloc>
-    inline bool
+    inline _GLIBCXX20_CONSTEXPR bool
     operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
__y)
     { return !(__x == __y); }

   /// Based on operator<
   template<typename _Tp, typename _Alloc>
-    inline bool
+    inline _GLIBCXX20_CONSTEXPR bool
     operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
__y)
     { return __y < __x; }

   /// Based on operator<
   template<typename _Tp, typename _Alloc>
-    inline bool
+    inline _GLIBCXX20_CONSTEXPR bool
     operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
__y)
     { return !(__y < __x); }

   /// Based on operator<
   template<typename _Tp, typename _Alloc>
-    inline bool
+    inline _GLIBCXX20_CONSTEXPR bool
     operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
__y)
     { return !(__x < __y); }
 #endif // three-way comparison

   /// See std::vector::swap().
   template<typename _Tp, typename _Alloc>
-    inline void
+    inline _GLIBCXX20_CONSTEXPR void
     swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
     _GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y)))
     { __x.swap(__y); }
diff --git a/libstdc++-v3/include/bits/vector.tcc
b/libstdc++-v3/include/bits/vector.tcc
index 27e63388feb..6f2e3eaa21d 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -62,6 +62,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     void
     vector<_Tp, _Alloc>::
     reserve(size_type __n)
@@ -102,6 +103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   template<typename _Tp, typename _Alloc>
     template<typename... _Args>
 #if __cplusplus > 201402L
+      _GLIBCXX20_CONSTEXPR
       typename vector<_Tp, _Alloc>::reference
 #else
       void
@@ -126,6 +128,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #endif

   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     typename vector<_Tp, _Alloc>::iterator
     vector<_Tp, _Alloc>::
 #if __cplusplus >= 201103L
@@ -167,6 +170,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     typename vector<_Tp, _Alloc>::iterator
     vector<_Tp, _Alloc>::
     _M_erase(iterator __position)
@@ -180,6 +184,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     typename vector<_Tp, _Alloc>::iterator
     vector<_Tp, _Alloc>::
     _M_erase(iterator __first, iterator __last)
@@ -194,6 +199,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     vector<_Tp, _Alloc>&
     vector<_Tp, _Alloc>::
     operator=(const vector<_Tp, _Alloc>& __x)
@@ -253,6 +259,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     void
     vector<_Tp, _Alloc>::
     _M_fill_assign(size_t __n, const value_type& __val)
@@ -278,6 +285,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   template<typename _Tp, typename _Alloc>
     template<typename _InputIterator>
+      _GLIBCXX20_CONSTEXPR
       void
       vector<_Tp, _Alloc>::
       _M_assign_aux(_InputIterator __first, _InputIterator __last,
@@ -296,6 +304,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   template<typename _Tp, typename _Alloc>
     template<typename _ForwardIterator>
+      _GLIBCXX20_CONSTEXPR
       void
       vector<_Tp, _Alloc>::
       _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
@@ -336,6 +345,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

 #if __cplusplus >= 201103L
   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     auto
     vector<_Tp, _Alloc>::
     _M_insert_rval(const_iterator __position, value_type&& __v) -> iterator
@@ -360,6 +370,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   template<typename _Tp, typename _Alloc>
     template<typename... _Args>
+      _GLIBCXX20_CONSTEXPR
       auto
       vector<_Tp, _Alloc>::
       _M_emplace_aux(const_iterator __position, _Args&&... __args)
@@ -391,6 +402,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   template<typename _Tp, typename _Alloc>
     template<typename _Arg>
+      _GLIBCXX20_CONSTEXPR
       void
       vector<_Tp, _Alloc>::
       _M_insert_aux(iterator __position, _Arg&& __arg)
@@ -422,6 +434,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
   template<typename _Tp, typename _Alloc>
     template<typename... _Args>
+      _GLIBCXX20_CONSTEXPR
       void
       vector<_Tp, _Alloc>::
       _M_realloc_insert(iterator __position, _Args&&... __args)
@@ -505,6 +518,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     void
     vector<_Tp, _Alloc>::
     _M_fill_insert(iterator __position, size_type __n, const value_type&
__x)
@@ -607,6 +621,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

 #if __cplusplus >= 201103L
   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     void
     vector<_Tp, _Alloc>::
     _M_default_append(size_type __n)
@@ -683,6 +698,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Tp, typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     bool
     vector<_Tp, _Alloc>::
     _M_shrink_to_fit()
@@ -696,6 +712,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   template<typename _Tp, typename _Alloc>
     template<typename _InputIterator>
+      _GLIBCXX20_CONSTEXPR
       void
       vector<_Tp, _Alloc>::
       _M_range_insert(iterator __pos, _InputIterator __first,
@@ -717,6 +734,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   template<typename _Tp, typename _Alloc>
     template<typename _ForwardIterator>
+      _GLIBCXX20_CONSTEXPR
       void
       vector<_Tp, _Alloc>::
       _M_range_insert(iterator __position, _ForwardIterator __first,
@@ -806,6 +824,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   // vector<bool>
   template<typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     void
     vector<bool, _Alloc>::
     _M_reallocate(size_type __n)
@@ -820,6 +839,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     void
     vector<bool, _Alloc>::
     _M_fill_insert(iterator __position, size_type __n, bool __x)
@@ -852,6 +872,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

   template<typename _Alloc>
     template<typename _ForwardIterator>
+      _GLIBCXX20_CONSTEXPR
       void
       vector<bool, _Alloc>::
       _M_insert_range(iterator __position, _ForwardIterator __first,
@@ -886,6 +907,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       }

   template<typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     void
     vector<bool, _Alloc>::
     _M_insert_aux(iterator __position, bool __x)
@@ -914,6 +936,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     typename vector<bool, _Alloc>::iterator
     vector<bool, _Alloc>::
     _M_erase(iterator __position)
@@ -925,6 +948,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     }

   template<typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     typename vector<bool, _Alloc>::iterator
     vector<bool, _Alloc>::
     _M_erase(iterator __first, iterator __last)
@@ -936,6 +960,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

 #if __cplusplus >= 201103L
   template<typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     bool
     vector<bool, _Alloc>::
     _M_shrink_to_fit()
@@ -963,6 +988,7 @@ namespace std _GLIBCXX_VISIBILITY(default)
 _GLIBCXX_BEGIN_NAMESPACE_VERSION

   template<typename _Alloc>
+    _GLIBCXX20_CONSTEXPR
     size_t
     hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>::
     operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>& __b) const
noexcept
diff --git a/libstdc++-v3/include/debug/safe_iterator.tcc
b/libstdc++-v3/include/debug/safe_iterator.tcc
index f694e514239..c9b56c63c17 100644
--- a/libstdc++-v3/include/debug/safe_iterator.tcc
+++ b/libstdc++-v3/include/debug/safe_iterator.tcc
@@ -376,7 +376,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }

   template<typename _Ite, typename _Seq, typename _Cat, typename _Tp>
-    void
+    _GLIBCXX20_CONSTEXPR void
     __fill_a(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&
__first,
      const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>& __last,
      const _Tp& __value)
diff --git
a/libstdc++-v3/testsuite/23_containers/headers/vector/synopsis.cc
b/libstdc++-v3/testsuite/23_containers/headers/vector/synopsis.cc
index 54f449e56cb..8dda2742718 100644
--- a/libstdc++-v3/testsuite/23_containers/headers/vector/synopsis.cc
+++ b/libstdc++-v3/testsuite/23_containers/headers/vector/synopsis.cc
@@ -25,58 +25,72 @@ namespace std {
   template <class T, class Allocator> class vector;

   template <class T, class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator==(const vector<T,Allocator>& x,
                     const vector<T,Allocator>& y);

   template <class T, class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator< (const vector<T,Allocator>& x,
                     const vector<T,Allocator>& y);

   template <class T, class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator!=(const vector<T,Allocator>& x,
                     const vector<T,Allocator>& y);

   template <class T, class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator> (const vector<T,Allocator>& x,
                     const vector<T,Allocator>& y);

   template <class T, class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator>=(const vector<T,Allocator>& x,
                     const vector<T,Allocator>& y);

   template <class T, class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator<=(const vector<T,Allocator>& x,
                     const vector<T,Allocator>& y);

   template <class T, class Allocator>
+    _GLIBCXX20_CONSTEXPR
     void swap(vector<T,Allocator>& x, vector<T,Allocator>& y);

   template <class Allocator> class vector<bool,Allocator>;

   template <class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator==(const vector<bool,Allocator>& x,
                     const vector<bool,Allocator>& y);

   template <class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator< (const vector<bool,Allocator>& x,
                     const vector<bool,Allocator>& y);

   template <class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator!=(const vector<bool,Allocator>& x,
                     const vector<bool,Allocator>& y);

   template <class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator> (const vector<bool,Allocator>& x,
                     const vector<bool,Allocator>& y);

   template <class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator>=(const vector<bool,Allocator>& x,
                     const vector<bool,Allocator>& y);

   template <class Allocator>
+    _GLIBCXX20_CONSTEXPR
     bool operator<=(const vector<bool,Allocator>& x,
                     const vector<bool,Allocator>& y);

   template <class Allocator>
+    _GLIBCXX20_CONSTEXPR
     void swap(vector<bool,Allocator>& x, vector<bool,Allocator>& y);
 }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/constructors.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/constructors.cc
new file mode 100644
index 00000000000..27f458b9ec4
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/constexpr/constructors.cc
@@ -0,0 +1,139 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
+
+#include<cstddef>
+#include<type_traits>
+#include<vector>
+
+namespace constructor_group_one{
+  constexpr std::vector<int> case_1;
+  static_assert(case_1.size() == 0);
+}
+
+
+void constructor_group_two(){
+  constexpr std::vector<int> case_2_1(0, 1);
+
+  static_assert(case_2_1.size() == 0);
+
+  //*
+  constexpr std::vector<int> case_2_2(1, 2);
+  static_assert(case_2_2.size() == 1);
+  static_assert(case_2_2.at(0) == 2);
+  //*/
+  //*
+  constexpr std::vector<int> case_2_3(2, 3);
+  static_assert(case_2_3.size() == 2);
+  static_assert(case_2_3.at(0) == 3);
+  static_assert(case_2_3.at(1) == 3);
+
+  constexpr std::vector<int> case_2_4(5, 4);
+  static_assert(case_2_4.size() == 5);
+  static_assert(case_2_4.at(0) == 4);
+  static_assert(case_2_4.at(1) == 4);
+  static_assert(case_2_4.at(2) == 4);
+  static_assert(case_2_4.at(3) == 4);
+  //*/
+}
+
+
+namespace constructor_group_three{
+  /*
+  constexpr std::vector<int> case_3_1(0);
+  static_assert(case_3_1.size() == 0);
+  //*//*
+  constexpr std::vector<int> case_3_2(1);
+  static_assert(case_3_2.size() == 1);
+  //*//*
+  constexpr std::vector<int> case_3_3(2);
+  static_assert(case_3_3.size() == 2);
+  //*//*
+  constexpr std::vector<int> case_3_4(5);
+  static_assert(case_3_4.size() == 5);
+  //*///*
+}
+
+
+namespace constructor_group_four{
+  /*
+  using constructor_group_two::case_2_1;
+  using constructor_group_two::case_2_2;
+  using constructor_group_two::case_2_3;
+  using constructor_group_two::case_2_4;
+  /*
+  constexpr std::vector<int> case_4_1(case_2_1.begin(), case_2_1.end());
+  static_assert(case_4_1.size() == 0);
+
+  constexpr std::vector<int> case_4_2(case_2_2.begin(), case_2_2.end());
+  static_assert(case_4_2.size() == 1);
+  static_assert(case_4_2.at(0) == 2);
+
+  constexpr std::vector<int> case_4_3(case_2_3.begin(), case_2_3.end());
+  static_assert(case_4_3.size() == 2);
+  static_assert(case_4_3.at(0) == 3);
+  static_assert(case_4_3.at(1) == 3);
+
+  constexpr std::vector<int> case_4_4(case_2_4.begin(), case_2_4.end());
+  static_assert(case_4_4.size() == 5);
+  static_assert(case_4_4.at(0) == 4);
+  static_assert(case_4_4.at(1) == 4);
+  static_assert(case_4_4.at(2) == 4);
+  static_assert(case_4_4.at(3) == 4);
+  //*/
+}
+
+
+
+namespace constructor_group_five{
+  /*
+  using constructor_group_two::case_2_1;
+  using constructor_group_two::case_2_2;
+  using constructor_group_two::case_2_3;
+  using constructor_group_two::case_2_4;
+  /*
+  constexpr std::vector<int> case_5_1(case_2_1);
+  static_assert(case_5_1.size() == 0);
+
+  constexpr std::vector<int> case_5_2(case_2_2);
+  static_assert(case_5_2.size() == 1);
+  static_assert(case_5_2.at(0) == 2);
+
+  constexpr std::vector<int> case_5_3(case_2_3);
+  static_assert(case_5_3.size() == 2);
+  static_assert(case_5_3.at(0) == 3);
+  static_assert(case_5_3.at(1) == 3);
+
+  constexpr std::vector<int> case_5_4(case_2_4);
+  static_assert(case_5_4.size() == 4);
+  static_assert(case_5_4.at(0) == 4);
+  static_assert(case_5_4.at(1) == 4);
+  static_assert(case_5_4.at(2) == 4);
+  static_assert(case_5_4.at(3) == 4);
+  //*/
+}
+
+
+namespace constructor_group_eight{
+  /*
+  constexpr std::vector<int> case_8_1({});
+  static_assert(case_8_1.size() == 0);
+
+  constexpr std::vector<int> case_8_2({-1});
+  static_assert(case_8_2.size() == 1);
+  static_assert(case_8_2.at(0) == -1);
+
+  constexpr std::vector<int> case_8_3({-1, -2});
+  static_assert(case_8_3.size() == 2);
+  static_assert(case_8_3.at(0) == -1);
+  static_assert(case_8_3.at(1) == -2);
+
+  constexpr std::vector<int> case_8_4({-2, -1, 0, 1, 2});
+  static_assert(case_8_4.size() == 5);
+  static_assert(case_8_4.at(0) == -2);
+  static_assert(case_8_4.at(1) == -1);
+  static_assert(case_8_4.at(2) == 0);
+  static_assert(case_8_4.at(3) == 1);
+  static_assert(case_8_4.at(4) == 2);
+  //*/
+}
+
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/forward_iterators.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/forward_iterators.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/forward_iterators.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_assignment_operator.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_assignment_operator.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_assignment_operator.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_at.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_at.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_at.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_back.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_back.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_back.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_capacity.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_capacity.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_capacity.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_clear.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_clear.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_clear.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_data.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_data.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_data.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace_back.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace_back.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace_back.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_empty.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_empty.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_empty.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_erase.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_erase.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_erase.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_front.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_front.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_front.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_index_access.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_index_access.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_index_access.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_insert.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_insert.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_insert.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_max_size.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_max_size.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_max_size.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_pop_back.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_pop_back.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_pop_back.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_push_back.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_push_back.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_push_back.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_reserve.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_reserve.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_reserve.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_resize.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_resize.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_resize.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_shrink_to_fit.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_shrink_to_fit.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_shrink_to_fit.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_size.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_size.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_size.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_swap.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_swap.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_swap.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_difference_type.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_difference_type.cc
new file mode 100644
index 00000000000..3e0b5b71542
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_difference_type.cc
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
+/*
+#include<cstddef>
+#include<type_traits>
+#include<vector>
+
+static_assert(std::is_same<std::vector<int>::difference_type,
size_t>::value);
+*/
\ No newline at end of file
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_iterator.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_iterator.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_iterator.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_size_type.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_size_type.cc
new file mode 100644
index 00000000000..091c964d9e3
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_size_type.cc
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
+/*
+#include<cstddef>
+#include<type_traits>
+#include<vector>
+
+
+static_assert(std::is_same<size_t, size_t>::value);
+
+static_assert(std::is_same<std::vector<int>::size_type, size_t>::value);
+*/
\ No newline at end of file
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_value_type.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_value_type.cc
new file mode 100644
index 00000000000..7bda8ad9264
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_value_type.cc
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
+/*
+#include<type_traits>
+#include<vector>
+
+
+static_assert(std::is_same<int, int>::value);
+
+static_assert(std::is_same<std::vector<int>::value_type, int>::value);
+
+static_assert(!std::is_same<std::vector<char>::value_type, int>::value);
+*/
\ No newline at end of file
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_equality.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_equality.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_equality.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_than.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_than.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_than.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_then_or_equal.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_then_or_equal.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_then_or_equal.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_inequality.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_inequality.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_inequality.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_than.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_than.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_than.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_then_or_equal.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_then_or_equal.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_then_or_equal.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/reverse_iterators.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/reverse_iterators.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/reverse_iterators.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_element.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_element.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_element.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }
diff --git
a/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_vector.cc
b/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_vector.cc
new file mode 100644
index 00000000000..80465074309
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_vector.cc
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++20 } }
+// { dg-options "-std=c++20" }

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Pointlessly fragile constexpr vector implementation I need some guidance on.
       [not found] ` <CAJY4aWEeHrXjab-EnnYqaV12oOdSTOm3Wku4AGTWR-gFfKBcDA@mail.gmail.com>
@ 2020-10-28  2:38   ` Josh Marshall
  0 siblings, 0 replies; 3+ messages in thread
From: Josh Marshall @ 2020-10-28  2:38 UTC (permalink / raw)
  To: Andrew Melo, gcc-help

My work is currently alive at https://gitlab.com/anadon/gcc

On Tue, Oct 27, 2020 at 9:56 PM Andrew Melo <andrew.melo@gmail.com> wrote:

> You might want to retry this mail, there's a diff inside that doesn't
> make sense without context.
>
> On Tue, Oct 27, 2020 at 8:09 PM Josh Marshall via Gcc-help
> <gcc-help@gcc.gnu.org> wrote:
> >
> > Hello all,
> >
> > This side project is definitely showing me a few of my shortcomings as a
> > programmer, so please bear with me while I try to learn.  I have an
> > implementation of constexpr vector which works in the null case, but
> fails
> > on any case when it is constructed with contents or has contents added.
> >
> >
> > diff --git a/include/ChangeLog b/include/ChangeLog
> > index 41e3b76766e..d24b105b145 100644
> > --- a/include/ChangeLog
> > +++ b/include/ChangeLog
> > @@ -22,6 +22,11 @@
> >   * dwarf2.h (enum dwarf_sect_v5): A new enum section for the
> >   sections in a DWARF 5 DWP file (DWP version 5).
> >
> > +2020-09-09  Caroline Tice  <cmtice@google.com>
> > +
> > + * dwarf2.h (enum dwarf_sect_v5): A new enum section for the
> > + sections in a DWARF 5 DWP file (DWP version 5).
> > +
> >  2020-09-08  Felix Willgerodt  <felix.willgerodt@intel.com>
> >
> >   * floatformat.h (floatformat_bfloat16_big): New.
> > diff --git a/libstdc++-v3/include/bits/alloc_traits.h
> > b/libstdc++-v3/include/bits/alloc_traits.h
> > index 86d8ed221ff..e989637aeb7 100644
> > --- a/libstdc++-v3/include/bits/alloc_traits.h
> > +++ b/libstdc++-v3/include/bits/alloc_traits.h
> > @@ -717,6 +717,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >     */
> >
> >    template<typename _ForwardIterator, typename _Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      _Destroy(_ForwardIterator __first, _ForwardIterator __last,
> >       _Allocator& __alloc)
> > @@ -731,7 +732,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >      }
> >
> >    template<typename _ForwardIterator, typename _Tp>
> > -    inline void
> > +    inline _GLIBCXX20_CONSTEXPR void
> >      _Destroy(_ForwardIterator __first, _ForwardIterator __last,
> >       allocator<_Tp>&)
> >      {
> > diff --git a/libstdc++-v3/include/bits/deque.tcc
> > b/libstdc++-v3/include/bits/deque.tcc
> > index 651ae70a84b..8236bef15e9 100644
> > --- a/libstdc++-v3/include/bits/deque.tcc
> > +++ b/libstdc++-v3/include/bits/deque.tcc
> > @@ -974,6 +974,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
> >    // Overload for deque::iterators, exploiting the "segmented-iterator
> >    // optimization".
> >    template<typename _Tp, typename _VTp>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      __fill_a1(const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&
> > __first,
> >        const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>& __last,
> > diff --git a/libstdc++-v3/include/bits/stl_algobase.h
> > b/libstdc++-v3/include/bits/stl_algobase.h
> > index d19f68871ab..128d8d8d4ad 100644
> > --- a/libstdc++-v3/include/bits/stl_algobase.h
> > +++ b/libstdc++-v3/include/bits/stl_algobase.h
> > @@ -953,23 +953,24 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
> >      { std::__fill_a1(__first.base(), __last.base(), __value); }
> >
> >    template<typename _Tp, typename _VTp>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      __fill_a1(const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&,
> >        const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&,
> >        const _VTp&);
> >
> >    void
> > +  _GLIBCXX20_CONSTEXPR
> >    __fill_a1(_GLIBCXX_STD_C::_Bit_iterator,
> _GLIBCXX_STD_C::_Bit_iterator,
> >      const bool&);
> >
> >    template<typename _FIte, typename _Tp>
> > -    _GLIBCXX20_CONSTEXPR
> > -    inline void
> > +    inline _GLIBCXX20_CONSTEXPR void
> >      __fill_a(_FIte __first, _FIte __last, const _Tp& __value)
> >      { std::__fill_a1(__first, __last, __value); }
> >
> >    template<typename _Ite, typename _Seq, typename _Cat, typename _Tp>
> > -    void
> > +    _GLIBCXX20_CONSTEXPR void
> >      __fill_a(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
> >       const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
> >       const _Tp&);
> > diff --git a/libstdc++-v3/include/bits/stl_bvector.h
> > b/libstdc++-v3/include/bits/stl_bvector.h
> > index d6f5435bdfb..8548b350c13 100644
> > --- a/libstdc++-v3/include/bits/stl_bvector.h
> > +++ b/libstdc++-v3/include/bits/stl_bvector.h
> > @@ -74,18 +74,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      _Bit_type * _M_p;
> >      _Bit_type _M_mask;
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_reference(_Bit_type * __x, _Bit_type __y)
> >      : _M_p(__x), _M_mask(__y) { }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }
> >
> >  #if __cplusplus >= 201103L
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_reference(const _Bit_reference&) = default;
> >  #endif
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      operator bool() const _GLIBCXX_NOEXCEPT
> >      { return !!(*_M_p & _M_mask); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_reference&
> >      operator=(bool __x) _GLIBCXX_NOEXCEPT
> >      {
> > @@ -96,24 +101,29 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_reference&
> >      operator=(const _Bit_reference& __x) _GLIBCXX_NOEXCEPT
> >      { return *this = bool(__x); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      bool
> >      operator==(const _Bit_reference& __x) const
> >      { return bool(*this) == bool(__x); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      bool
> >      operator<(const _Bit_reference& __x) const
> >      { return !bool(*this) && bool(__x); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      flip() _GLIBCXX_NOEXCEPT
> >      { *_M_p ^= _M_mask; }
> >    };
> >
> >  #if __cplusplus >= 201103L
> > +  _GLIBCXX20_CONSTEXPR
> >    inline void
> >    swap(_Bit_reference __x, _Bit_reference __y) noexcept
> >    {
> > @@ -122,6 +132,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      __y = __tmp;
> >    }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >    inline void
> >    swap(_Bit_reference __x, bool& __y) noexcept
> >    {
> > @@ -130,6 +141,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      __y = __tmp;
> >    }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >    inline void
> >    swap(bool& __x, _Bit_reference __y) noexcept
> >    {
> > @@ -145,9 +157,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      _Bit_type * _M_p;
> >      unsigned int _M_offset;
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_iterator_base(_Bit_type * __x, unsigned int __y)
> >      : _M_p(__x), _M_offset(__y) { }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      _M_bump_up()
> >      {
> > @@ -158,6 +172,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   }
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      _M_bump_down()
> >      {
> > @@ -168,6 +183,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   }
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      _M_incr(ptrdiff_t __i)
> >      {
> > @@ -196,31 +212,31 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return __x._M_offset <=> __y._M_offset;
> >      }
> >  #else
> > -    friend bool
> > +    friend _GLIBCXX20_CONSTEXPR bool
> >      operator<(const _Bit_iterator_base& __x, const _Bit_iterator_base&
> __y)
> >      {
> >        return __x._M_p < __y._M_p
> >      || (__x._M_p == __y._M_p && __x._M_offset < __y._M_offset);
> >      }
> >
> > -    friend bool
> > +    friend _GLIBCXX20_CONSTEXPR bool
> >      operator!=(const _Bit_iterator_base& __x, const _Bit_iterator_base&
> > __y)
> >      { return !(__x == __y); }
> >
> > -    friend bool
> > +    friend _GLIBCXX20_CONSTEXPR bool
> >      operator>(const _Bit_iterator_base& __x, const _Bit_iterator_base&
> __y)
> >      { return __y < __x; }
> >
> > -    friend bool
> > +    friend _GLIBCXX20_CONSTEXPR bool
> >      operator<=(const _Bit_iterator_base& __x, const _Bit_iterator_base&
> > __y)
> >      { return !(__y < __x); }
> >
> > -    friend bool
> > +    friend _GLIBCXX20_CONSTEXPR bool
> >      operator>=(const _Bit_iterator_base& __x, const _Bit_iterator_base&
> > __y)
> >      { return !(__x < __y); }
> >  #endif // three-way comparison
> >
> > -    friend ptrdiff_t
> > +    friend _GLIBCXX20_CONSTEXPR ptrdiff_t
> >      operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base&
> __y)
> >      {
> >        return (int(_S_word_bit) * (__x._M_p - __y._M_p)
> > @@ -238,19 +254,24 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >      typedef _Bit_iterator   iterator;
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_iterator() : _Bit_iterator_base(0, 0) { }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_iterator(_Bit_type * __x, unsigned int __y)
> >      : _Bit_iterator_base(__x, __y) { }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      iterator
> >      _M_const_cast() const
> >      { return *this; }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      reference
> >      operator*() const
> >      { return reference(_M_p, 1UL << _M_offset); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      iterator&
> >      operator++()
> >      {
> > @@ -258,6 +279,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      iterator
> >      operator++(int)
> >      {
> > @@ -266,6 +288,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return __tmp;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      iterator&
> >      operator--()
> >      {
> > @@ -273,6 +296,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      iterator
> >      operator--(int)
> >      {
> > @@ -281,6 +305,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return __tmp;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      iterator&
> >      operator+=(difference_type __i)
> >      {
> > @@ -288,6 +313,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      iterator&
> >      operator-=(difference_type __i)
> >      {
> > @@ -295,10 +321,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      reference
> >      operator[](difference_type __i) const
> >      { return *(*this + __i); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      friend iterator
> >      operator+(const iterator& __x, difference_type __n)
> >      {
> > @@ -307,10 +335,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return __tmp;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      friend iterator
> >      operator+(difference_type __n, const iterator& __x)
> >      { return __x + __n; }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      friend iterator
> >      operator-(const iterator& __x, difference_type __n)
> >      {
> > @@ -331,22 +361,28 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >      typedef _Bit_const_iterator  const_iterator;
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_const_iterator() : _Bit_iterator_base(0, 0) { }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_const_iterator(_Bit_type * __x, unsigned int __y)
> >      : _Bit_iterator_base(__x, __y) { }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_const_iterator(const _Bit_iterator& __x)
> >      : _Bit_iterator_base(__x._M_p, __x._M_offset) { }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      _Bit_iterator
> >      _M_const_cast() const
> >      { return _Bit_iterator(_M_p, _M_offset); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      const_reference
> >      operator*() const
> >      { return _Bit_reference(_M_p, 1UL << _M_offset); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      const_iterator&
> >      operator++()
> >      {
> > @@ -354,6 +390,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      const_iterator
> >      operator++(int)
> >      {
> > @@ -362,6 +399,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return __tmp;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      const_iterator&
> >      operator--()
> >      {
> > @@ -369,6 +407,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      const_iterator
> >      operator--(int)
> >      {
> > @@ -377,6 +416,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return __tmp;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      const_iterator&
> >      operator+=(difference_type __i)
> >      {
> > @@ -384,6 +424,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      const_iterator&
> >      operator-=(difference_type __i)
> >      {
> > @@ -391,10 +432,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return *this;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      const_reference
> >      operator[](difference_type __i) const
> >      { return *(*this + __i); }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      friend const_iterator
> >      operator+(const const_iterator& __x, difference_type __n)
> >      {
> > @@ -403,6 +446,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return __tmp;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      friend const_iterator
> >      operator-(const const_iterator& __x, difference_type __n)
> >      {
> > @@ -411,6 +455,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        return __tmp;
> >      }
> >
> > +    _GLIBCXX20_CONSTEXPR
> >      friend const_iterator
> >      operator+(difference_type __n, const const_iterator& __x)
> >      { return __x + __n; }
> > @@ -434,25 +479,32 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   struct {
> >    _Bit_type* _M_p;
> >    // Allow assignment from iterators (assume offset is zero):
> > +    _GLIBCXX20_CONSTEXPR
> >    void operator=(_Bit_iterator __it) { _M_p = __it._M_p; }
> >   } _M_start;
> >  #endif
> >   _Bit_iterator _M_finish;
> >   _Bit_pointer _M_end_of_storage;
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bvector_impl_data() _GLIBCXX_NOEXCEPT
> >   : _M_start(), _M_finish(), _M_end_of_storage()
> >   { }
> >
> >  #if __cplusplus >= 201103L
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bvector_impl_data(const _Bvector_impl_data&) = default;
> > +
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bvector_impl_data&
> >   operator=(const _Bvector_impl_data&) = default;
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bvector_impl_data(_Bvector_impl_data&& __x) noexcept
> >   : _Bvector_impl_data(__x)
> >   { __x._M_reset(); }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_move_data(_Bvector_impl_data&& __x) noexcept
> >   {
> > @@ -461,10 +513,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   }
> >  #endif
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_reset() _GLIBCXX_NOEXCEPT
> >   { *this = _Bvector_impl_data(); }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_swap_data(_Bvector_impl_data& __x) _GLIBCXX_NOEXCEPT
> >   {
> > @@ -477,11 +531,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        struct _Bvector_impl
> >   : public _Bit_alloc_type, public _Bvector_impl_data
> >        {
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bvector_impl() _GLIBCXX_NOEXCEPT_IF(
> >    is_nothrow_default_constructible<_Bit_alloc_type>::value)
> >   : _Bit_alloc_type()
> >   { }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bvector_impl(const _Bit_alloc_type& __a) _GLIBCXX_NOEXCEPT
> >   : _Bit_alloc_type(__a)
> >   { }
> > @@ -489,15 +545,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >   // Not defaulted, to enforce noexcept(true) even when
> >   // !is_nothrow_move_constructible<_Bit_alloc_type>.
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bvector_impl(_Bvector_impl&& __x) noexcept
> >   : _Bit_alloc_type(std::move(__x)), _Bvector_impl_data(std::move(__x))
> >   { }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bvector_impl(_Bit_alloc_type&& __a, _Bvector_impl&& __x) noexcept
> >   : _Bit_alloc_type(std::move(__a)), _Bvector_impl_data(std::move(__x))
> >   { }
> >  #endif
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Bit_type*
> >   _M_end_addr() const _GLIBCXX_NOEXCEPT
> >   {
> > @@ -510,45 +569,55 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      public:
> >        typedef _Alloc allocator_type;
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Bit_alloc_type&
> >        _M_get_Bit_allocator() _GLIBCXX_NOEXCEPT
> >        { return this->_M_impl; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const _Bit_alloc_type&
> >        _M_get_Bit_allocator() const _GLIBCXX_NOEXCEPT
> >        { return this->_M_impl; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        allocator_type
> >        get_allocator() const _GLIBCXX_NOEXCEPT
> >        { return allocator_type(_M_get_Bit_allocator()); }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        _Bvector_base() = default;
> >  #else
> >        _Bvector_base() { }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Bvector_base(const allocator_type& __a)
> >        : _M_impl(__a) { }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        _Bvector_base(_Bvector_base&&) = default;
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Bvector_base(_Bvector_base&& __x, const allocator_type& __a)
> > noexcept
> >        : _M_impl(_Bit_alloc_type(__a), std::move(__x._M_impl))
> >        { }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        ~_Bvector_base()
> >        { this->_M_deallocate(); }
> >
> >      protected:
> >        _Bvector_impl _M_impl;
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Bit_pointer
> >        _M_allocate(size_t __n)
> >        { return _Bit_alloc_traits::allocate(_M_impl, _S_nword(__n)); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_deallocate()
> >        {
> > @@ -563,11 +632,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_move_data(_Bvector_base&& __x) noexcept
> >        { _M_impl._M_move_data(std::move(__x._M_impl)); }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        static size_t
> >        _S_nword(size_t __n)
> >        { return (__n + int(_S_word_bit) - 1) / int(_S_word_bit); }
> > @@ -629,6 +700,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        typedef std::reverse_iterator<iterator> reverse_iterator;
> >        typedef _Alloc allocator_type;
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        allocator_type
> >        get_allocator() const
> >        { return _Base::get_allocator(); }
> > @@ -641,21 +713,25 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >      public:
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        vector() = default;
> >  #else
> >        vector() { }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        explicit
> >        vector(const allocator_type& __a)
> >        : _Base(__a) { }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        explicit
> >        vector(size_type __n, const allocator_type& __a =
> allocator_type())
> >        : vector(__n, false, __a)
> >        { }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(size_type __n, const bool& __value,
> >       const allocator_type& __a = allocator_type())
> >  #else
> > @@ -669,6 +745,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   _M_initialize_value(__value);
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(const vector& __x)
> >        :
> > _Base(_Bit_alloc_traits::_S_select_on_copy(__x._M_get_Bit_allocator()))
> >        {
> > @@ -677,13 +754,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(vector&&) = default;
> >
> >      private:
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(vector&& __x, const allocator_type& __a, true_type)
> noexcept
> >        : _Base(std::move(__x), __a)
> >        { }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(vector&& __x, const allocator_type& __a, false_type)
> >        : _Base(__a)
> >        {
> > @@ -698,12 +778,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >      public:
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(vector&& __x, const allocator_type& __a)
> >        noexcept(_Bit_alloc_traits::_S_always_equal())
> >        : vector(std::move(__x), __a,
> >         typename _Bit_alloc_traits::is_always_equal{})
> >        { }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(const vector& __x, const allocator_type& __a)
> >        : _Base(__a)
> >        {
> > @@ -711,6 +793,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   _M_copy_aligned(__x.begin(), __x.end(), begin());
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(initializer_list<bool> __l,
> >       const allocator_type& __a = allocator_type())
> >        : _Base(__a)
> > @@ -723,6 +806,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >        template<typename _InputIterator,
> >         typename = std::_RequireInputIter<_InputIterator>>
> > +  _GLIBCXX20_CONSTEXPR
> >   vector(_InputIterator __first, _InputIterator __last,
> >         const allocator_type& __a = allocator_type())
> >   : _Base(__a)
> > @@ -742,8 +826,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        ~vector() _GLIBCXX_NOEXCEPT { }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        vector&
> >        operator=(const vector& __x)
> >        {
> > @@ -775,6 +861,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        vector&
> >        operator=(vector&& __x)
> > noexcept(_Bit_alloc_traits::_S_nothrow_move())
> >        {
> > @@ -800,6 +887,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   return *this;
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        vector&
> >        operator=(initializer_list<bool> __l)
> >        {
> > @@ -812,6 +900,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        // versions: one that takes a count, and one that takes a range.
> >        // The range version is a member template, so we dispatch on
> whether
> >        // or not the type is an integer.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        assign(size_type __n, const bool& __x)
> >        { _M_fill_assign(__n, __x); }
> > @@ -819,6 +908,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >        template<typename _InputIterator,
> >         typename = std::_RequireInputIter<_InputIterator>>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   assign(_InputIterator __first, _InputIterator __last)
> >   { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
> > @@ -834,65 +924,80 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        assign(initializer_list<bool> __l)
> >        { _M_assign_aux(__l.begin(), __l.end(),
> > random_access_iterator_tag()); }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        begin() _GLIBCXX_NOEXCEPT
> >        { return iterator(this->_M_impl._M_start._M_p, 0); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_iterator
> >        begin() const _GLIBCXX_NOEXCEPT
> >        { return const_iterator(this->_M_impl._M_start._M_p, 0); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        end() _GLIBCXX_NOEXCEPT
> >        { return this->_M_impl._M_finish; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_iterator
> >        end() const _GLIBCXX_NOEXCEPT
> >        { return this->_M_impl._M_finish; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        reverse_iterator
> >        rbegin() _GLIBCXX_NOEXCEPT
> >        { return reverse_iterator(end()); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reverse_iterator
> >        rbegin() const _GLIBCXX_NOEXCEPT
> >        { return const_reverse_iterator(end()); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        reverse_iterator
> >        rend() _GLIBCXX_NOEXCEPT
> >        { return reverse_iterator(begin()); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reverse_iterator
> >        rend() const _GLIBCXX_NOEXCEPT
> >        { return const_reverse_iterator(begin()); }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        const_iterator
> >        cbegin() const noexcept
> >        { return const_iterator(this->_M_impl._M_start._M_p, 0); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_iterator
> >        cend() const noexcept
> >        { return this->_M_impl._M_finish; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reverse_iterator
> >        crbegin() const noexcept
> >        { return const_reverse_iterator(end()); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reverse_iterator
> >        crend() const noexcept
> >        { return const_reverse_iterator(begin()); }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        size_type
> >        size() const _GLIBCXX_NOEXCEPT
> >        { return size_type(end() - begin()); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        size_type
> >        max_size() const _GLIBCXX_NOEXCEPT
> >        {
> > @@ -905,24 +1010,28 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   ? __asize * int(_S_word_bit) : __isize);
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        size_type
> >        capacity() const _GLIBCXX_NOEXCEPT
> >        { return size_type(const_iterator(this->_M_impl._M_end_addr(), 0)
> >   - begin()); }
> >
> > -      _GLIBCXX_NODISCARD bool
> > +      _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR bool
> >        empty() const _GLIBCXX_NOEXCEPT
> >        { return begin() == end(); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        reference
> >        operator[](size_type __n)
> >        { return begin()[__n]; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reference
> >        operator[](size_type __n) const
> >        { return begin()[__n]; }
> >
> >      protected:
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_range_check(size_type __n) const
> >        {
> > @@ -934,14 +1043,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >      public:
> > +      _GLIBCXX20_CONSTEXPR
> >        reference
> >        at(size_type __n)
> >        { _M_range_check(__n); return (*this)[__n]; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reference
> >        at(size_type __n) const
> >        { _M_range_check(__n); return (*this)[__n]; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        reserve(size_type __n)
> >        {
> > @@ -951,18 +1063,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >    _M_reallocate(__n);
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        reference
> >        front()
> >        { return *begin(); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reference
> >        front() const
> >        { return *begin(); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        reference
> >        back()
> >        { return *(end() - 1); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reference
> >        back() const
> >        { return *(end() - 1); }
> > @@ -972,9 +1088,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        // N.B. DR 464 says nothing about vector<bool> but we need
> something
> >        // here due to the way we are implementing DR 464 in the
> debug-mode
> >        // vector class.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        data() _GLIBCXX_NOEXCEPT { }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        push_back(bool __x)
> >        {
> > @@ -984,6 +1102,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >    _M_insert_aux(end(), __x);
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        swap(vector& __x) _GLIBCXX_NOEXCEPT
> >        {
> > @@ -997,6 +1116,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >        // [23.2.5]/1, third-to-last entry in synopsis listing
> > +      _GLIBCXX20_CONSTEXPR
> >        static void
> >        swap(reference __x, reference __y) _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1005,6 +1125,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   __y = __tmp;
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >  #if __cplusplus >= 201103L
> >        insert(const_iterator __position, const bool& __x = bool())
> > @@ -1024,6 +1145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >        template<typename _InputIterator,
> >         typename = std::_RequireInputIter<_InputIterator>>
> > +  _GLIBCXX20_CONSTEXPR
> >   iterator
> >   insert(const_iterator __position,
> >         _InputIterator __first, _InputIterator __last)
> > @@ -1047,6 +1169,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        insert(const_iterator __position, size_type __n, const bool& __x)
> >        {
> > @@ -1061,15 +1184,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        insert(const_iterator __p, initializer_list<bool> __l)
> >        { return this->insert(__p, __l.begin(), __l.end()); }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        pop_back()
> >        { --this->_M_impl._M_finish; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >  #if __cplusplus >= 201103L
> >        erase(const_iterator __position)
> > @@ -1078,6 +1204,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >        { return _M_erase(__position._M_const_cast()); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >  #if __cplusplus >= 201103L
> >        erase(const_iterator __first, const_iterator __last)
> > @@ -1086,6 +1213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >        { return _M_erase(__first._M_const_cast(),
> __last._M_const_cast()); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        resize(size_type __new_size, bool __x = bool())
> >        {
> > @@ -1096,11 +1224,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        shrink_to_fit()
> >        { _M_shrink_to_fit(); }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        flip() _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1109,6 +1239,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >    *__p = ~*__p;
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        clear() _GLIBCXX_NOEXCEPT
> >        { _M_erase_at_end(begin()); }
> > @@ -1116,6 +1247,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >        template<typename... _Args>
> >  #if __cplusplus > 201402L
> > +  _GLIBCXX20_CONSTEXPR
> >   reference
> >  #else
> >   void
> > @@ -1129,6 +1261,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   }
> >
> >        template<typename... _Args>
> > +  _GLIBCXX20_CONSTEXPR
> >   iterator
> >   emplace(const_iterator __pos, _Args&&... __args)
> >   { return insert(__pos, bool(__args...)); }
> > @@ -1136,6 +1269,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >      protected:
> >        // Precondition: __first._M_offset == 0 && __result._M_offset ==
> 0.
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        _M_copy_aligned(const_iterator __first, const_iterator __last,
> >        iterator __result)
> > @@ -1145,6 +1279,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   iterator(__q, 0));
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_initialize(size_type __n)
> >        {
> > @@ -1158,6 +1293,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >    }
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_initialize_value(bool __x)
> >        {
> > @@ -1167,10 +1303,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >     * sizeof(_Bit_type));
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_reallocate(size_type __n);
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        bool
> >        _M_shrink_to_fit();
> >  #endif
> > @@ -1195,6 +1333,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_initialize_range(_InputIterator __first, _InputIterator __last,
> >      std::input_iterator_tag)
> > @@ -1204,6 +1343,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   }
> >
> >        template<typename _ForwardIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
> >      std::forward_iterator_tag)
> > @@ -1228,6 +1368,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_fill_assign(size_t __n, bool __x)
> >        {
> > @@ -1244,6 +1385,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_assign_aux(_InputIterator __first, _InputIterator __last,
> >        std::input_iterator_tag)
> > @@ -1258,6 +1400,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   }
> >
> >        template<typename _ForwardIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
> >        std::forward_iterator_tag)
> > @@ -1292,10 +1435,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >    std::__iterator_category(__first)); }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_fill_insert(iterator __position, size_type __n, bool __x);
> >
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_insert_range(iterator __pos, _InputIterator __first,
> >   _InputIterator __last, std::input_iterator_tag)
> > @@ -1308,13 +1453,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   }
> >
> >        template<typename _ForwardIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_insert_range(iterator __position, _ForwardIterator __first,
> >   _ForwardIterator __last, std::forward_iterator_tag);
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_insert_aux(iterator __position, bool __x);
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        size_type
> >        _M_check_len(size_type __n, const char* __s) const
> >        {
> > @@ -1325,19 +1473,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   return (__len < size() || __len > max_size()) ? max_size() : __len;
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_erase_at_end(iterator __pos)
> >        { this->_M_impl._M_finish = __pos; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        _M_erase(iterator __pos);
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        _M_erase(iterator __first, iterator __last);
> >    };
> >
> >  _GLIBCXX_END_NAMESPACE_CONTAINER
> >
> > +  _GLIBCXX20_CONSTEXPR
> >    inline void
> >    __fill_bvector(_GLIBCXX_STD_C::_Bit_type * __v,
> >   unsigned int __first, unsigned int __last, bool __x)
> > @@ -1354,6 +1506,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
> >        *__v &= ~__mask;
> >    }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >    inline void
> >    __fill_a1(_GLIBCXX_STD_C::_Bit_iterator __first,
> >      _GLIBCXX_STD_C::_Bit_iterator __last, const bool& __x)
> > @@ -1383,6 +1536,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
> >      struct hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>
> >      : public __hash_base<size_t, _GLIBCXX_STD_C::vector<bool, _Alloc>>
> >      {
> > +      _GLIBCXX20_CONSTEXPR
> >        size_t
> >        operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>&) const
> > noexcept;
> >      };
> > diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h
> > b/libstdc++-v3/include/bits/stl_uninitialized.h
> > index a3ccb72078b..c2d5ef36549 100644
> > --- a/libstdc++-v3/include/bits/stl_uninitialized.h
> > +++ b/libstdc++-v3/include/bits/stl_uninitialized.h
> > @@ -225,7 +225,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >      struct __uninitialized_fill_n
> >      {
> >        template<typename _ForwardIterator, typename _Size, typename _Tp>
> > -        static _ForwardIterator
> > +        static _GLIBCXX20_CONSTEXPR _ForwardIterator
> >          __uninit_fill_n(_ForwardIterator __first, _Size __n,
> >   const _Tp& __x)
> >          {
> > @@ -248,7 +248,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >      struct __uninitialized_fill_n<true>
> >      {
> >        template<typename _ForwardIterator, typename _Size, typename _Tp>
> > -        static _ForwardIterator
> > +        static _GLIBCXX20_CONSTEXPR _ForwardIterator
> >          __uninit_fill_n(_ForwardIterator __first, _Size __n,
> >   const _Tp& __x)
> >          { return std::fill_n(__first, __n, __x); }
> > @@ -268,7 +268,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >     *  Like fill_n(), but does not require an initialized output range.
> >    */
> >    template<typename _ForwardIterator, typename _Size, typename _Tp>
> > -    inline _ForwardIterator
> > +    inline _GLIBCXX20_CONSTEXPR _ForwardIterator
> >      uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp&
> > __x)
> >      {
> >        typedef typename iterator_traits<_ForwardIterator>::value_type
> > @@ -382,6 +382,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >
> >    template<typename _ForwardIterator, typename _Size, typename _Tp,
> >     typename _Allocator>
> > +     _GLIBCXX20_CONSTEXPR
> >      _ForwardIterator
> >      __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
> >       const _Tp& __x, _Allocator& __alloc)
> > @@ -403,7 +404,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >
> >    template<typename _ForwardIterator, typename _Size, typename _Tp,
> >     typename _Tp2>
> > -    inline _ForwardIterator
> > +    inline _GLIBCXX20_CONSTEXPR _ForwardIterator
> >      __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
> >       const _Tp& __x, allocator<_Tp2>&)
> >      { return std::uninitialized_fill_n(__first, __n, __x); }
> > diff --git a/libstdc++-v3/include/bits/stl_vector.h
> > b/libstdc++-v3/include/bits/stl_vector.h
> > index d3f1b1fae5c..952f140fa0a 100644
> > --- a/libstdc++-v3/include/bits/stl_vector.h
> > +++ b/libstdc++-v3/include/bits/stl_vector.h
> > @@ -94,17 +94,20 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   pointer _M_finish;
> >   pointer _M_end_of_storage;
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Vector_impl_data() _GLIBCXX_NOEXCEPT
> >   : _M_start(), _M_finish(), _M_end_of_storage()
> >   { }
> >
> >  #if __cplusplus >= 201103L
> > +  _GLIBCXX20_CONSTEXPR
> >   _Vector_impl_data(_Vector_impl_data&& __x) noexcept
> >   : _M_start(__x._M_start), _M_finish(__x._M_finish),
> >    _M_end_of_storage(__x._M_end_of_storage)
> >   { __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
> >  #endif
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_copy_data(_Vector_impl_data const& __x) _GLIBCXX_NOEXCEPT
> >   {
> > @@ -113,6 +116,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >    _M_end_of_storage = __x._M_end_of_storage;
> >   }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
> >   {
> > @@ -128,11 +132,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        struct _Vector_impl
> >   : public _Tp_alloc_type, public _Vector_impl_data
> >        {
> > +  _GLIBCXX20_CONSTEXPR
> >   _Vector_impl() _GLIBCXX_NOEXCEPT_IF(
> >      is_nothrow_default_constructible<_Tp_alloc_type>::value)
> >   : _Tp_alloc_type()
> >   { }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
> >   : _Tp_alloc_type(__a)
> >   { }
> > @@ -140,14 +146,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >   // Not defaulted, to enforce noexcept(true) even when
> >   // !is_nothrow_move_constructible<_Tp_alloc_type>.
> > +  _GLIBCXX20_CONSTEXPR
> >   _Vector_impl(_Vector_impl&& __x) noexcept
> >   : _Tp_alloc_type(std::move(__x)), _Vector_impl_data(std::move(__x))
> >   { }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Vector_impl(_Tp_alloc_type&& __a) noexcept
> >   : _Tp_alloc_type(std::move(__a))
> >   { }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   _Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
> >   : _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv))
> >   { }
> > @@ -160,15 +169,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
> >        ::size_type size_type;
> >
> > -    static void _S_shrink(_Vector_impl&, size_type) { }
> > -    static void _S_on_dealloc(_Vector_impl&) { }
> > +    static _GLIBCXX20_CONSTEXPR void _S_shrink(_Vector_impl&,
> size_type) {
> > }
> > +    static _GLIBCXX20_CONSTEXPR void _S_on_dealloc(_Vector_impl&) { }
> >
> >      typedef _Vector_impl& _Reinit;
> >
> >      struct _Grow
> >      {
> > -      _Grow(_Vector_impl&, size_type) { }
> > -      void _M_grew(size_type) { }
> > +      _GLIBCXX20_CONSTEXPR _Grow(_Vector_impl&, size_type) { }
> > +      _GLIBCXX20_CONSTEXPR void _M_grew(size_type) { }
> >      };
> >    };
> >
> > @@ -181,22 +190,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >      // Adjust ASan annotation for [_M_start, _M_end_of_storage) to
> >      // mark end of valid region as __curr instead of __prev.
> > -    static void
> > +    static _GLIBCXX20_CONSTEXPR void
> >      _S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
> >      {
> >        __sanitizer_annotate_contiguous_container(__impl._M_start,
> >    __impl._M_end_of_storage, __prev, __curr);
> >      }
> >
> > -    static void
> > +    static _GLIBCXX20_CONSTEXPR void
> >      _S_grow(_Vector_impl& __impl, size_type __n)
> >      { _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }
> >
> > -    static void
> > +    static _GLIBCXX20_CONSTEXPR void
> >      _S_shrink(_Vector_impl& __impl, size_type __n)
> >      { _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }
> >
> > -    static void
> > +    static _GLIBCXX20_CONSTEXPR void
> >      _S_on_dealloc(_Vector_impl& __impl)
> >      {
> >        if (__impl._M_start)
> > @@ -206,13 +215,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      // Used on reallocation to tell ASan unused capacity is invalid.
> >      struct _Reinit
> >      {
> > -      explicit _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
> > +      explicit _GLIBCXX20_CONSTEXPR _Reinit(_Vector_impl& __impl) :
> > _M_impl(__impl)
> >        {
> >   // Mark unused capacity as valid again before deallocating it.
> >   _S_on_dealloc(_M_impl);
> >        }
> >
> > -      ~_Reinit()
> > +      _GLIBCXX20_CONSTEXPR ~_Reinit()
> >        {
> >   // Mark unused capacity as invalid after reallocation.
> >   if (_M_impl._M_start)
> > @@ -223,25 +232,28 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        _Vector_impl& _M_impl;
> >
> >  #if __cplusplus >= 201103L
> > -      _Reinit(const _Reinit&) = delete;
> > -      _Reinit& operator=(const _Reinit&) = delete;
> > +      _GLIBCXX20_CONSTEXPR _Reinit(const _Reinit&) = delete;
> > +      _GLIBCXX20_CONSTEXPR _Reinit& operator=(const _Reinit&) = delete;
> >  #endif
> >      };
> >
> >      // Tell ASan when unused capacity is initialized to be valid.
> >      struct _Grow
> >      {
> > +        _GLIBCXX20_CONSTEXPR
> >        _Grow(_Vector_impl& __impl, size_type __n)
> >        : _M_impl(__impl), _M_n(__n)
> >        { _S_grow(_M_impl, __n); }
> >
> > +        _GLIBCXX20_CONSTEXPR
> >        ~_Grow() { if (_M_n) _S_shrink(_M_impl, _M_n); }
> >
> > +        _GLIBCXX20_CONSTEXPR
> >        void _M_grew(size_type __n) { _M_n -= __n; }
> >
> >  #if __cplusplus >= 201103L
> > -      _Grow(const _Grow&) = delete;
> > -      _Grow& operator=(const _Grow&) = delete;
> > +      _GLIBCXX20_CONSTEXPR _Grow(const _Grow&) = delete;
> > +      _GLIBCXX20_CONSTEXPR _Grow& operator=(const _Grow&) = delete;
> >  #endif
> >      private:
> >        _Vector_impl& _M_impl;
> > @@ -272,46 +284,54 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      public:
> >        typedef _Alloc allocator_type;
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Tp_alloc_type&
> >        _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
> >        { return this->_M_impl; }
> >
> > -      const _Tp_alloc_type&
> > +      const _GLIBCXX20_CONSTEXPR _Tp_alloc_type&
> >        _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
> >        { return this->_M_impl; }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        allocator_type
> >        get_allocator() const _GLIBCXX_NOEXCEPT
> >        { return allocator_type(_M_get_Tp_allocator()); }
> >
> >  #if __cplusplus >= 201103L
> > -      _Vector_base() = default;
> > +      _GLIBCXX20_CONSTEXPR _Vector_base() = default;
> >  #else
> >        _Vector_base() { }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
> >        : _M_impl(__a) { }
> >
> >        // Kept for ABI compatibility.
> >  #if !_GLIBCXX_INLINE_VERSION
> > +      _GLIBCXX20_CONSTEXPR
> >        _Vector_base(size_t __n)
> >        : _M_impl()
> >        { _M_create_storage(__n); }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Vector_base(size_t __n, const allocator_type& __a)
> >        : _M_impl(__a)
> >        { _M_create_storage(__n); }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        _Vector_base(_Vector_base&&) = default;
> >
> >        // Kept for ABI compatibility.
> >  # if !_GLIBCXX_INLINE_VERSION
> > +      _GLIBCXX20_CONSTEXPR
> >        _Vector_base(_Tp_alloc_type&& __a) noexcept
> >        : _M_impl(std::move(__a)) { }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Vector_base(_Vector_base&& __x, const allocator_type& __a)
> >        : _M_impl(__a)
> >        {
> > @@ -325,11 +345,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >  # endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        _Vector_base(const allocator_type& __a, _Vector_base&& __x)
> >        : _M_impl(_Tp_alloc_type(__a), std::move(__x._M_impl))
> >        { }
> >  #endif
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        ~_Vector_base() _GLIBCXX_NOEXCEPT
> >        {
> >   _M_deallocate(_M_impl._M_start,
> > @@ -339,6 +361,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      public:
> >        _Vector_impl _M_impl;
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        pointer
> >        _M_allocate(size_t __n)
> >        {
> > @@ -346,6 +369,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_deallocate(pointer __p, size_t __n)
> >        {
> > @@ -355,6 +379,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >      protected:
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_create_storage(size_t __n)
> >        {
> > @@ -449,19 +474,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
> >        }
> >
> > -      static pointer
> > +      static _GLIBCXX20_CONSTEXPR 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
> > +      static _GLIBCXX20_CONSTEXPR pointer
> >        _S_do_relocate(pointer, pointer, pointer __result,
> >       _Tp_alloc_type&, false_type) noexcept
> >        { return __result; }
> >
> > -      static pointer
> > +      static _GLIBCXX20_CONSTEXPR pointer
> >        _S_relocate(pointer __first, pointer __last, pointer __result,
> >    _Tp_alloc_type& __alloc) noexcept
> >        {
> > @@ -484,7 +509,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  @brief  Creates a %vector with no elements.
> >         */
> >  #if __cplusplus >= 201103L
> > -      vector() = default;
> > +      _GLIBCXX20_CONSTEXPR vector() = default;
> >  #else
> >        vector() { }
> >  #endif
> > @@ -494,6 +519,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  @param  __a  An allocator object.
> >         */
> >        explicit
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT
> >        : _Base(__a) { }
> >
> > @@ -507,6 +533,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  constructed elements.
> >         */
> >        explicit
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(size_type __n, const allocator_type& __a =
> allocator_type())
> >        : _Base(_S_check_init_len(__n, __a), __a)
> >        { _M_default_initialize(__n); }
> > @@ -519,6 +546,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *
> >         *  This constructor fills the %vector with @a __n copies of @a
> > __value.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(size_type __n, const value_type& __value,
> >       const allocator_type& __a = allocator_type())
> >        : _Base(_S_check_init_len(__n, __a), __a)
> > @@ -550,6 +578,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  The newly-created %vector uses a copy of the allocator object
> > used
> >         *  by @a __x (unless the allocator traits dictate a different
> > object).
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(const vector& __x)
> >        : _Base(__x.size(),
> >   _Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
> > @@ -569,9 +598,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  The contents of the moved instance are a valid, but
> unspecified
> >         *  %vector.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(vector&&) noexcept = default;
> >
> >        /// Copy constructor with alternative allocator
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(const vector& __x, const allocator_type& __a)
> >        : _Base(__x.size(), __a)
> >        {
> > @@ -582,10 +613,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >      private:
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(vector&& __rv, const allocator_type& __m, true_type)
> noexcept
> >        : _Base(__m, std::move(__rv))
> >        { }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(vector&& __rv, const allocator_type& __m, false_type)
> >        : _Base(__m)
> >        {
> > @@ -604,6 +637,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >      public:
> >        /// Move constructor with alternative allocator
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(vector&& __rv, const allocator_type& __m)
> >        noexcept( noexcept(
> >   vector(std::declval<vector&&>(), std::declval<const allocator_type&>(),
> > @@ -622,6 +656,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  This will call the element type's copy constructor N times
> >         *  (where N is @a __l.size()) and do no memory reallocation.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        vector(initializer_list<value_type> __l,
> >       const allocator_type& __a = allocator_type())
> >        : _Base(__a)
> > @@ -650,6 +685,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >        template<typename _InputIterator,
> >         typename = std::_RequireInputIter<_InputIterator>>
> > +  _GLIBCXX20_CONSTEXPR
> >   vector(_InputIterator __first, _InputIterator __last,
> >         const allocator_type& __a = allocator_type())
> >   : _Base(__a)
> > @@ -675,6 +711,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  not touched in any way.  Managing the pointer is the user's
> >         *  responsibility.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        ~vector() _GLIBCXX_NOEXCEPT
> >        {
> >   std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
> > @@ -691,6 +728,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *
> >         *  Whether the allocator is copied depends on the allocator
> traits.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        vector&
> >        operator=(const vector& __x);
> >
> > @@ -705,6 +743,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *
> >         *  Whether the allocator is moved depends on the allocator
> traits.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        vector&
> >        operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
> >        {
> > @@ -726,6 +765,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  that the resulting %vector's size is the same as the number
> >         *  of elements assigned.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        vector&
> >        operator=(initializer_list<value_type> __l)
> >        {
> > @@ -745,6 +785,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  %vector and that the resulting %vector's size is the same as
> >         *  the number of elements assigned.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        assign(size_type __n, const value_type& __val)
> >        { _M_fill_assign(__n, __val); }
> > @@ -764,6 +805,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >        template<typename _InputIterator,
> >         typename = std::_RequireInputIter<_InputIterator>>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   assign(_InputIterator __first, _InputIterator __last)
> >   { _M_assign_dispatch(__first, __last, __false_type()); }
> > @@ -790,6 +832,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  that the resulting %vector's size is the same as the number
> >         *  of elements assigned.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        assign(initializer_list<value_type> __l)
> >        {
> > @@ -807,6 +850,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  element in the %vector.  Iteration is done in ordinary
> >         *  element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        begin() _GLIBCXX_NOEXCEPT
> >        { return iterator(this->_M_impl._M_start); }
> > @@ -816,6 +860,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  first element in the %vector.  Iteration is done in ordinary
> >         *  element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_iterator
> >        begin() const _GLIBCXX_NOEXCEPT
> >        { return const_iterator(this->_M_impl._M_start); }
> > @@ -825,6 +870,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  element in the %vector.  Iteration is done in ordinary
> >         *  element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        end() _GLIBCXX_NOEXCEPT
> >        { return iterator(this->_M_impl._M_finish); }
> > @@ -834,6 +880,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  the last element in the %vector.  Iteration is done in
> >         *  ordinary element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_iterator
> >        end() const _GLIBCXX_NOEXCEPT
> >        { return const_iterator(this->_M_impl._M_finish); }
> > @@ -843,6 +890,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  last element in the %vector.  Iteration is done in reverse
> >         *  element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        reverse_iterator
> >        rbegin() _GLIBCXX_NOEXCEPT
> >        { return reverse_iterator(end()); }
> > @@ -852,6 +900,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  to the last element in the %vector.  Iteration is done in
> >         *  reverse element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reverse_iterator
> >        rbegin() const _GLIBCXX_NOEXCEPT
> >        { return const_reverse_iterator(end()); }
> > @@ -861,6 +910,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  before the first element in the %vector.  Iteration is done
> >         *  in reverse element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        reverse_iterator
> >        rend() _GLIBCXX_NOEXCEPT
> >        { return reverse_iterator(begin()); }
> > @@ -870,6 +920,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  to one before the first element in the %vector.  Iteration
> >         *  is done in reverse element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reverse_iterator
> >        rend() const _GLIBCXX_NOEXCEPT
> >        { return const_reverse_iterator(begin()); }
> > @@ -880,6 +931,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  first element in the %vector.  Iteration is done in ordinary
> >         *  element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_iterator
> >        cbegin() const noexcept
> >        { return const_iterator(this->_M_impl._M_start); }
> > @@ -889,6 +941,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  the last element in the %vector.  Iteration is done in
> >         *  ordinary element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_iterator
> >        cend() const noexcept
> >        { return const_iterator(this->_M_impl._M_finish); }
> > @@ -898,6 +951,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  to the last element in the %vector.  Iteration is done in
> >         *  reverse element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reverse_iterator
> >        crbegin() const noexcept
> >        { return const_reverse_iterator(end()); }
> > @@ -907,6 +961,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  to one before the first element in the %vector.  Iteration
> >         *  is done in reverse element order.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reverse_iterator
> >        crend() const noexcept
> >        { return const_reverse_iterator(begin()); }
> > @@ -914,11 +969,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // [23.2.4.2] capacity
> >        /**  Returns the number of elements in the %vector.  */
> > +      _GLIBCXX20_CONSTEXPR
> >        size_type
> >        size() const _GLIBCXX_NOEXCEPT
> >        { return size_type(this->_M_impl._M_finish -
> > this->_M_impl._M_start); }
> >
> >        /**  Returns the size() of the largest possible %vector.  */
> > +      _GLIBCXX20_CONSTEXPR
> >        size_type
> >        max_size() const _GLIBCXX_NOEXCEPT
> >        { return _S_max_size(_M_get_Tp_allocator()); }
> > @@ -933,6 +990,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  %vector's current size the %vector is truncated, otherwise
> >         *  default constructed elements are appended.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        resize(size_type __new_size)
> >        {
> > @@ -953,6 +1011,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  the %vector is extended and new elements are populated with
> >         *  given data.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        resize(size_type __new_size, const value_type& __x)
> >        {
> > @@ -973,6 +1032,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  the %vector is extended and new elements are populated with
> >         *  given data.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        resize(size_type __new_size, value_type __x = value_type())
> >        {
> > @@ -985,6 +1045,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >  #if __cplusplus >= 201103L
> >        /**  A non-binding request to reduce capacity() to size().  */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        shrink_to_fit()
> >        { _M_shrink_to_fit(); }
> > @@ -994,6 +1055,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  Returns the total number of elements that the %vector can
> >         *  hold before needing to allocate more memory.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        size_type
> >        capacity() const _GLIBCXX_NOEXCEPT
> >        { return size_type(this->_M_impl._M_end_of_storage
> > @@ -1003,6 +1065,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  Returns true if the %vector is empty.  (Thus begin() would
> >         *  equal end().)
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        _GLIBCXX_NODISCARD bool
> >        empty() const _GLIBCXX_NOEXCEPT
> >        { return begin() == end(); }
> > @@ -1024,6 +1087,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  %advance, and thus prevent a possible reallocation of memory
> >         *  and copying of %vector data.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        reserve(size_type __n);
> >
> > @@ -1039,6 +1103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  out_of_range lookups are not defined. (For checked lookups
> >         *  see at().)
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        reference
> >        operator[](size_type __n) _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1057,6 +1122,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  out_of_range lookups are not defined. (For checked lookups
> >         *  see at().)
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reference
> >        operator[](size_type __n) const _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1066,6 +1132,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >      protected:
> >        /// Safety check used only from at().
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_range_check(size_type __n) const
> >        {
> > @@ -1088,6 +1155,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  is first checked that it is in the range of the vector.  The
> >         *  function throws out_of_range if the check fails.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        reference
> >        at(size_type __n)
> >        {
> > @@ -1106,6 +1174,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  is first checked that it is in the range of the vector.  The
> >         *  function throws out_of_range if the check fails.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reference
> >        at(size_type __n) const
> >        {
> > @@ -1117,6 +1186,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  Returns a read/write reference to the data at the first
> >         *  element of the %vector.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        reference
> >        front() _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1128,6 +1198,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  Returns a read-only (constant) reference to the data at the
> first
> >         *  element of the %vector.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reference
> >        front() const _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1139,6 +1210,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  Returns a read/write reference to the data at the last
> >         *  element of the %vector.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        reference
> >        back() _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1150,6 +1222,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  Returns a read-only (constant) reference to the data at the
> >         *  last element of the %vector.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        const_reference
> >        back() const _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1164,10 +1237,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *   Returns a pointer such that [data(), data() + size()) is a
> valid
> >         *   range.  For a non-empty %vector, data() == &front().
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        _Tp*
> >        data() _GLIBCXX_NOEXCEPT
> >        { return _M_data_ptr(this->_M_impl._M_start); }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        const _Tp*
> >        data() const _GLIBCXX_NOEXCEPT
> >        { return _M_data_ptr(this->_M_impl._M_start); }
> > @@ -1183,6 +1258,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  done in constant time if the %vector has preallocated space
> >         *  available.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        push_back(const value_type& __x)
> >        {
> > @@ -1199,12 +1275,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >  #if __cplusplus >= 201103L
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        push_back(value_type&& __x)
> >        { emplace_back(std::move(__x)); }
> >
> >        template<typename... _Args>
> >  #if __cplusplus > 201402L
> > +  _GLIBCXX20_CONSTEXPR
> >   reference
> >  #else
> >   void
> > @@ -1221,6 +1299,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  data is needed, it should be retrieved before pop_back() is
> >         *  called.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        pop_back() _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1244,6 +1323,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  std::list.
> >         */
> >        template<typename... _Args>
> > +  _GLIBCXX20_CONSTEXPR
> >   iterator
> >   emplace(const_iterator __position, _Args&&... __args)
> >   { return _M_emplace_aux(__position, std::forward<_Args>(__args)...); }
> > @@ -1259,6 +1339,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  could be expensive for a %vector and if it is frequently
> >         *  used the user should consider using std::list.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        insert(const_iterator __position, const value_type& __x);
> >  #else
> > @@ -1289,6 +1370,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  could be expensive for a %vector and if it is frequently
> >         *  used the user should consider using std::list.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        insert(const_iterator __position, value_type&& __x)
> >        { return _M_insert_rval(__position, std::move(__x)); }
> > @@ -1306,6 +1388,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  %vector and if it is frequently used the user should
> >         *  consider using std::list.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        insert(const_iterator __position, initializer_list<value_type>
> __l)
> >        {
> > @@ -1331,6 +1414,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  %vector and if it is frequently used the user should
> >         *  consider using std::list.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        insert(const_iterator __position, size_type __n, const value_type&
> > __x)
> >        {
> > @@ -1375,6 +1459,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         */
> >        template<typename _InputIterator,
> >         typename = std::_RequireInputIter<_InputIterator>>
> > +  _GLIBCXX20_CONSTEXPR
> >   iterator
> >   insert(const_iterator __position, _InputIterator __first,
> >         _InputIterator __last)
> > @@ -1400,6 +1485,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  consider using std::list.
> >         */
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   insert(iterator __position, _InputIterator __first,
> >         _InputIterator __last)
> > @@ -1425,6 +1511,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  the pointed-to memory is not touched in any way.  Managing
> >         *  the pointer is the user's responsibility.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >  #if __cplusplus >= 201103L
> >        erase(const_iterator __position)
> > @@ -1452,6 +1539,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  pointers, the pointed-to memory is not touched in any way.
> >         *  Managing the pointer is the user's responsibility.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >  #if __cplusplus >= 201103L
> >        erase(const_iterator __first, const_iterator __last)
> > @@ -1476,6 +1564,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *
> >         *  Whether the allocators are swapped depends on the allocator
> > traits.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        swap(vector& __x) _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1494,6 +1583,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  pointed-to memory is not touched in any way.  Managing the
> > pointer is
> >         *  the user's responsibility.
> >         */
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        clear() _GLIBCXX_NOEXCEPT
> >        { _M_erase_at_end(this->_M_impl._M_start); }
> > @@ -1504,6 +1594,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >         *  obtain @a n bytes of memory, and then copies [first,last) into
> > it.
> >         */
> >        template<typename _ForwardIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   pointer
> >   _M_allocate_and_copy(size_type __n,
> >       _ForwardIterator __first, _ForwardIterator __last)
> > @@ -1531,6 +1622,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        // _GLIBCXX_RESOLVE_LIB_DEFECTS
> >        // 438. Ambiguity in the "do the right thing" clause
> >        template<typename _Integer>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
> >   {
> > @@ -1543,6 +1635,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Called by the range constructor to implement [23.1.1]/9
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
> >         __false_type)
> > @@ -1554,6 +1647,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Called by the second initialize_dispatch above
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_range_initialize(_InputIterator __first, _InputIterator __last,
> >      std::input_iterator_tag)
> > @@ -1573,6 +1667,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Called by the second initialize_dispatch above
> >        template<typename _ForwardIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
> >      std::forward_iterator_tag)
> > @@ -1589,6 +1684,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Called by the first initialize_dispatch above and by the
> >        // vector(n,value,a) constructor.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_fill_initialize(size_type __n, const value_type& __value)
> >        {
> > @@ -1599,6 +1695,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >  #if __cplusplus >= 201103L
> >        // Called by the vector(n) constructor.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_default_initialize(size_type __n)
> >        {
> > @@ -1616,12 +1713,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        // _GLIBCXX_RESOLVE_LIB_DEFECTS
> >        // 438. Ambiguity in the "do the right thing" clause
> >        template<typename _Integer>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
> >   { _M_fill_assign(__n, __val); }
> >
> >        // Called by the range assign to implement [23.1.1]/9
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
> >     __false_type)
> > @@ -1629,18 +1728,21 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Called by the second assign_dispatch above
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_assign_aux(_InputIterator __first, _InputIterator __last,
> >        std::input_iterator_tag);
> >
> >        // Called by the second assign_dispatch above
> >        template<typename _ForwardIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
> >        std::forward_iterator_tag);
> >
> >        // Called by assign(n,t), and the range assign when it turns out
> >        // to be the same thing.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_fill_assign(size_type __n, const value_type& __val);
> >
> > @@ -1651,6 +1753,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        // _GLIBCXX_RESOLVE_LIB_DEFECTS
> >        // 438. Ambiguity in the "do the right thing" clause
> >        template<typename _Integer>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
> >     __true_type)
> > @@ -1658,6 +1761,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Called by the range insert to implement [23.1.1]/9
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_insert_dispatch(iterator __pos, _InputIterator __first,
> >     _InputIterator __last, __false_type)
> > @@ -1668,26 +1772,31 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Called by the second insert_dispatch above
> >        template<typename _InputIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_range_insert(iterator __pos, _InputIterator __first,
> >   _InputIterator __last, std::input_iterator_tag);
> >
> >        // Called by the second insert_dispatch above
> >        template<typename _ForwardIterator>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_range_insert(iterator __pos, _ForwardIterator __first,
> >   _ForwardIterator __last, std::forward_iterator_tag);
> >
> >        // Called by insert(p,n,x), and the range insert when it turns out
> > to be
> >        // the same thing.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_fill_insert(iterator __pos, size_type __n, const value_type&
> __x);
> >
> >  #if __cplusplus >= 201103L
> >        // Called by resize(n).
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_default_append(size_type __n);
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        bool
> >        _M_shrink_to_fit();
> >  #endif
> > @@ -1706,19 +1815,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        {
> >   template<typename... _Args>
> >    explicit
> > +    _GLIBCXX20_CONSTEXPR
> >    _Temporary_value(vector* __vec, _Args&&... __args) : _M_this(__vec)
> >    {
> >      _Alloc_traits::construct(_M_this->_M_impl, _M_ptr(),
> >       std::forward<_Args>(__args)...);
> >    }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   ~_Temporary_value()
> >   { _Alloc_traits::destroy(_M_this->_M_impl, _M_ptr()); }
> >
> > +  _GLIBCXX20_CONSTEXPR
> >   value_type&
> >   _M_val() { return *_M_ptr(); }
> >
> >        private:
> > +  _GLIBCXX20_CONSTEXPR
> >   _Tp*
> >   _M_ptr() { return reinterpret_cast<_Tp*>(&__buf); }
> >
> > @@ -1729,29 +1842,35 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        // Called by insert(p,x) and other functions when insertion needs
> to
> >        // reallocate or move existing elements. _Arg is either _Tp& or
> _Tp.
> >        template<typename _Arg>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_insert_aux(iterator __position, _Arg&& __arg);
> >
> >        template<typename... _Args>
> > +  _GLIBCXX20_CONSTEXPR
> >   void
> >   _M_realloc_insert(iterator __position, _Args&&... __args);
> >
> >        // Either move-construct at the end, or forward to _M_insert_aux.
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        _M_insert_rval(const_iterator __position, value_type&& __v);
> >
> >        // Try to emplace at the end, otherwise forward to _M_insert_aux.
> >        template<typename... _Args>
> > +  _GLIBCXX20_CONSTEXPR
> >   iterator
> >   _M_emplace_aux(const_iterator __position, _Args&&... __args);
> >
> >        // Emplacing an rvalue of the correct type can use _M_insert_rval.
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        _M_emplace_aux(const_iterator __position, value_type&& __v)
> >        { return _M_insert_rval(__position, std::move(__v)); }
> >  #endif
> >
> >        // Called by _M_fill_insert, _M_insert_aux etc.
> > +      _GLIBCXX20_CONSTEXPR
> >        size_type
> >        _M_check_len(size_type __n, const char* __s) const
> >        {
> > @@ -1763,7 +1882,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >        // Called by constructors to check initial size.
> > -      static size_type
> > +      static _GLIBCXX20_CONSTEXPR size_type
> >        _S_check_init_len(size_type __n, const allocator_type& __a)
> >        {
> >   if (__n > _S_max_size(_Tp_alloc_type(__a)))
> > @@ -1772,7 +1891,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >   return __n;
> >        }
> >
> > -      static size_type
> > +      static _GLIBCXX20_CONSTEXPR size_type
> >        _S_max_size(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
> >        {
> >   // std::distance(begin(), end()) cannot be greater than PTRDIFF_MAX,
> > @@ -1788,6 +1907,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
> >        // _M_assign_aux.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_erase_at_end(pointer __pos) _GLIBCXX_NOEXCEPT
> >        {
> > @@ -1800,9 +1920,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >    }
> >        }
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        _M_erase(iterator __position);
> >
> > +      _GLIBCXX20_CONSTEXPR
> >        iterator
> >        _M_erase(iterator __first, iterator __last);
> >
> > @@ -1811,6 +1933,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        // Constant-time move assignment when source object's memory can
> be
> >        // moved, either because the source's allocator will move too
> >        // or because the allocators are equal.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_move_assign(vector&& __x, true_type) noexcept
> >        {
> > @@ -1822,6 +1945,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >        // Do move assignment when it might not be possible to move source
> >        // object's memory, resulting in a linear-time operation.
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        _M_move_assign(vector&& __x, false_type)
> >        {
> > @@ -1840,12 +1964,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >
> >        template<typename _Up>
> > +  _GLIBCXX20_CONSTEXPR
> >   _Up*
> >   _M_data_ptr(_Up* __ptr) const _GLIBCXX_NOEXCEPT
> >   { return __ptr; }
> >
> >  #if __cplusplus >= 201103L
> >        template<typename _Ptr>
> > +  _GLIBCXX20_CONSTEXPR
> >   typename std::pointer_traits<_Ptr>::element_type*
> >   _M_data_ptr(_Ptr __ptr) const
> >   { return empty() ? nullptr : std::__to_address(__ptr); }
> > @@ -1888,7 +2014,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >     *  and if corresponding elements compare equal.
> >    */
> >    template<typename _Tp, typename _Alloc>
> > -    inline bool
> > +    inline _GLIBCXX20_CONSTEXPR bool
> >      operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp,
> _Alloc>&
> > __y)
> >      { return (__x.size() == __y.size()
> >        && std::equal(__x.begin(), __x.end(), __y.begin())); }
> > @@ -1906,7 +2032,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >     *  `<` and `>=` etc.
> >    */
> >    template<typename _Tp, typename _Alloc>
> > -    inline __detail::__synth3way_t<_Tp>
> > +    inline _GLIBCXX20_CONSTEXPR __detail::__synth3way_t<_Tp>
> >      operator<=>(const vector<_Tp, _Alloc>& __x, const vector<_Tp,
> _Alloc>&
> > __y)
> >      {
> >        return std::lexicographical_compare_three_way(__x.begin(),
> __x.end(),
> > @@ -1926,39 +2052,39 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >     *  See std::lexicographical_compare() for how the determination is
> made.
> >    */
> >    template<typename _Tp, typename _Alloc>
> > -    inline bool
> > +    inline _GLIBCXX20_CONSTEXPR bool
> >      operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
> > __y)
> >      { return std::lexicographical_compare(__x.begin(), __x.end(),
> >    __y.begin(), __y.end()); }
> >
> >    /// Based on operator==
> >    template<typename _Tp, typename _Alloc>
> > -    inline bool
> > +    inline _GLIBCXX20_CONSTEXPR bool
> >      operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp,
> _Alloc>&
> > __y)
> >      { return !(__x == __y); }
> >
> >    /// Based on operator<
> >    template<typename _Tp, typename _Alloc>
> > -    inline bool
> > +    inline _GLIBCXX20_CONSTEXPR bool
> >      operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>&
> > __y)
> >      { return __y < __x; }
> >
> >    /// Based on operator<
> >    template<typename _Tp, typename _Alloc>
> > -    inline bool
> > +    inline _GLIBCXX20_CONSTEXPR bool
> >      operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp,
> _Alloc>&
> > __y)
> >      { return !(__y < __x); }
> >
> >    /// Based on operator<
> >    template<typename _Tp, typename _Alloc>
> > -    inline bool
> > +    inline _GLIBCXX20_CONSTEXPR bool
> >      operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp,
> _Alloc>&
> > __y)
> >      { return !(__x < __y); }
> >  #endif // three-way comparison
> >
> >    /// See std::vector::swap().
> >    template<typename _Tp, typename _Alloc>
> > -    inline void
> > +    inline _GLIBCXX20_CONSTEXPR void
> >      swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
> >      _GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y)))
> >      { __x.swap(__y); }
> > diff --git a/libstdc++-v3/include/bits/vector.tcc
> > b/libstdc++-v3/include/bits/vector.tcc
> > index 27e63388feb..6f2e3eaa21d 100644
> > --- a/libstdc++-v3/include/bits/vector.tcc
> > +++ b/libstdc++-v3/include/bits/vector.tcc
> > @@ -62,6 +62,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      vector<_Tp, _Alloc>::
> >      reserve(size_type __n)
> > @@ -102,6 +103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >    template<typename _Tp, typename _Alloc>
> >      template<typename... _Args>
> >  #if __cplusplus > 201402L
> > +      _GLIBCXX20_CONSTEXPR
> >        typename vector<_Tp, _Alloc>::reference
> >  #else
> >        void
> > @@ -126,6 +128,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #endif
> >
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      typename vector<_Tp, _Alloc>::iterator
> >      vector<_Tp, _Alloc>::
> >  #if __cplusplus >= 201103L
> > @@ -167,6 +170,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      typename vector<_Tp, _Alloc>::iterator
> >      vector<_Tp, _Alloc>::
> >      _M_erase(iterator __position)
> > @@ -180,6 +184,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      typename vector<_Tp, _Alloc>::iterator
> >      vector<_Tp, _Alloc>::
> >      _M_erase(iterator __first, iterator __last)
> > @@ -194,6 +199,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      vector<_Tp, _Alloc>&
> >      vector<_Tp, _Alloc>::
> >      operator=(const vector<_Tp, _Alloc>& __x)
> > @@ -253,6 +259,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      vector<_Tp, _Alloc>::
> >      _M_fill_assign(size_t __n, const value_type& __val)
> > @@ -278,6 +285,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    template<typename _Tp, typename _Alloc>
> >      template<typename _InputIterator>
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        vector<_Tp, _Alloc>::
> >        _M_assign_aux(_InputIterator __first, _InputIterator __last,
> > @@ -296,6 +304,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    template<typename _Tp, typename _Alloc>
> >      template<typename _ForwardIterator>
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        vector<_Tp, _Alloc>::
> >        _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
> > @@ -336,6 +345,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >  #if __cplusplus >= 201103L
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      auto
> >      vector<_Tp, _Alloc>::
> >      _M_insert_rval(const_iterator __position, value_type&& __v) ->
> iterator
> > @@ -360,6 +370,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    template<typename _Tp, typename _Alloc>
> >      template<typename... _Args>
> > +      _GLIBCXX20_CONSTEXPR
> >        auto
> >        vector<_Tp, _Alloc>::
> >        _M_emplace_aux(const_iterator __position, _Args&&... __args)
> > @@ -391,6 +402,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    template<typename _Tp, typename _Alloc>
> >      template<typename _Arg>
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        vector<_Tp, _Alloc>::
> >        _M_insert_aux(iterator __position, _Arg&& __arg)
> > @@ -422,6 +434,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >  #if __cplusplus >= 201103L
> >    template<typename _Tp, typename _Alloc>
> >      template<typename... _Args>
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        vector<_Tp, _Alloc>::
> >        _M_realloc_insert(iterator __position, _Args&&... __args)
> > @@ -505,6 +518,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      vector<_Tp, _Alloc>::
> >      _M_fill_insert(iterator __position, size_type __n, const value_type&
> > __x)
> > @@ -607,6 +621,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >  #if __cplusplus >= 201103L
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      vector<_Tp, _Alloc>::
> >      _M_default_append(size_type __n)
> > @@ -683,6 +698,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Tp, typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool
> >      vector<_Tp, _Alloc>::
> >      _M_shrink_to_fit()
> > @@ -696,6 +712,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    template<typename _Tp, typename _Alloc>
> >      template<typename _InputIterator>
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        vector<_Tp, _Alloc>::
> >        _M_range_insert(iterator __pos, _InputIterator __first,
> > @@ -717,6 +734,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    template<typename _Tp, typename _Alloc>
> >      template<typename _ForwardIterator>
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        vector<_Tp, _Alloc>::
> >        _M_range_insert(iterator __position, _ForwardIterator __first,
> > @@ -806,6 +824,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    // vector<bool>
> >    template<typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      vector<bool, _Alloc>::
> >      _M_reallocate(size_type __n)
> > @@ -820,6 +839,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      vector<bool, _Alloc>::
> >      _M_fill_insert(iterator __position, size_type __n, bool __x)
> > @@ -852,6 +872,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >    template<typename _Alloc>
> >      template<typename _ForwardIterator>
> > +      _GLIBCXX20_CONSTEXPR
> >        void
> >        vector<bool, _Alloc>::
> >        _M_insert_range(iterator __position, _ForwardIterator __first,
> > @@ -886,6 +907,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >        }
> >
> >    template<typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      void
> >      vector<bool, _Alloc>::
> >      _M_insert_aux(iterator __position, bool __x)
> > @@ -914,6 +936,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      typename vector<bool, _Alloc>::iterator
> >      vector<bool, _Alloc>::
> >      _M_erase(iterator __position)
> > @@ -925,6 +948,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >      }
> >
> >    template<typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      typename vector<bool, _Alloc>::iterator
> >      vector<bool, _Alloc>::
> >      _M_erase(iterator __first, iterator __last)
> > @@ -936,6 +960,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> >
> >  #if __cplusplus >= 201103L
> >    template<typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool
> >      vector<bool, _Alloc>::
> >      _M_shrink_to_fit()
> > @@ -963,6 +988,7 @@ namespace std _GLIBCXX_VISIBILITY(default)
> >  _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >
> >    template<typename _Alloc>
> > +    _GLIBCXX20_CONSTEXPR
> >      size_t
> >      hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>::
> >      operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>& __b) const
> > noexcept
> > diff --git a/libstdc++-v3/include/debug/safe_iterator.tcc
> > b/libstdc++-v3/include/debug/safe_iterator.tcc
> > index f694e514239..c9b56c63c17 100644
> > --- a/libstdc++-v3/include/debug/safe_iterator.tcc
> > +++ b/libstdc++-v3/include/debug/safe_iterator.tcc
> > @@ -376,7 +376,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >      }
> >
> >    template<typename _Ite, typename _Seq, typename _Cat, typename _Tp>
> > -    void
> > +    _GLIBCXX20_CONSTEXPR void
> >      __fill_a(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&
> > __first,
> >       const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>& __last,
> >       const _Tp& __value)
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/headers/vector/synopsis.cc
> > b/libstdc++-v3/testsuite/23_containers/headers/vector/synopsis.cc
> > index 54f449e56cb..8dda2742718 100644
> > --- a/libstdc++-v3/testsuite/23_containers/headers/vector/synopsis.cc
> > +++ b/libstdc++-v3/testsuite/23_containers/headers/vector/synopsis.cc
> > @@ -25,58 +25,72 @@ namespace std {
> >    template <class T, class Allocator> class vector;
> >
> >    template <class T, class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator==(const vector<T,Allocator>& x,
> >                      const vector<T,Allocator>& y);
> >
> >    template <class T, class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator< (const vector<T,Allocator>& x,
> >                      const vector<T,Allocator>& y);
> >
> >    template <class T, class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator!=(const vector<T,Allocator>& x,
> >                      const vector<T,Allocator>& y);
> >
> >    template <class T, class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator> (const vector<T,Allocator>& x,
> >                      const vector<T,Allocator>& y);
> >
> >    template <class T, class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator>=(const vector<T,Allocator>& x,
> >                      const vector<T,Allocator>& y);
> >
> >    template <class T, class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator<=(const vector<T,Allocator>& x,
> >                      const vector<T,Allocator>& y);
> >
> >    template <class T, class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      void swap(vector<T,Allocator>& x, vector<T,Allocator>& y);
> >
> >    template <class Allocator> class vector<bool,Allocator>;
> >
> >    template <class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator==(const vector<bool,Allocator>& x,
> >                      const vector<bool,Allocator>& y);
> >
> >    template <class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator< (const vector<bool,Allocator>& x,
> >                      const vector<bool,Allocator>& y);
> >
> >    template <class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator!=(const vector<bool,Allocator>& x,
> >                      const vector<bool,Allocator>& y);
> >
> >    template <class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator> (const vector<bool,Allocator>& x,
> >                      const vector<bool,Allocator>& y);
> >
> >    template <class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator>=(const vector<bool,Allocator>& x,
> >                      const vector<bool,Allocator>& y);
> >
> >    template <class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      bool operator<=(const vector<bool,Allocator>& x,
> >                      const vector<bool,Allocator>& y);
> >
> >    template <class Allocator>
> > +    _GLIBCXX20_CONSTEXPR
> >      void swap(vector<bool,Allocator>& x, vector<bool,Allocator>& y);
> >  }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/constructors.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/constructors.cc
> > new file mode 100644
> > index 00000000000..27f458b9ec4
> > --- /dev/null
> > +++
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/constructors.cc
> > @@ -0,0 +1,139 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > +
> > +#include<cstddef>
> > +#include<type_traits>
> > +#include<vector>
> > +
> > +namespace constructor_group_one{
> > +  constexpr std::vector<int> case_1;
> > +  static_assert(case_1.size() == 0);
> > +}
> > +
> > +
> > +void constructor_group_two(){
> > +  constexpr std::vector<int> case_2_1(0, 1);
> > +
> > +  static_assert(case_2_1.size() == 0);
> > +
> > +  //*
> > +  constexpr std::vector<int> case_2_2(1, 2);
> > +  static_assert(case_2_2.size() == 1);
> > +  static_assert(case_2_2.at(0) == 2);
> > +  //*/
> > +  //*
> > +  constexpr std::vector<int> case_2_3(2, 3);
> > +  static_assert(case_2_3.size() == 2);
> > +  static_assert(case_2_3.at(0) == 3);
> > +  static_assert(case_2_3.at(1) == 3);
> > +
> > +  constexpr std::vector<int> case_2_4(5, 4);
> > +  static_assert(case_2_4.size() == 5);
> > +  static_assert(case_2_4.at(0) == 4);
> > +  static_assert(case_2_4.at(1) == 4);
> > +  static_assert(case_2_4.at(2) == 4);
> > +  static_assert(case_2_4.at(3) == 4);
> > +  //*/
> > +}
> > +
> > +
> > +namespace constructor_group_three{
> > +  /*
> > +  constexpr std::vector<int> case_3_1(0);
> > +  static_assert(case_3_1.size() == 0);
> > +  //*//*
> > +  constexpr std::vector<int> case_3_2(1);
> > +  static_assert(case_3_2.size() == 1);
> > +  //*//*
> > +  constexpr std::vector<int> case_3_3(2);
> > +  static_assert(case_3_3.size() == 2);
> > +  //*//*
> > +  constexpr std::vector<int> case_3_4(5);
> > +  static_assert(case_3_4.size() == 5);
> > +  //*///*
> > +}
> > +
> > +
> > +namespace constructor_group_four{
> > +  /*
> > +  using constructor_group_two::case_2_1;
> > +  using constructor_group_two::case_2_2;
> > +  using constructor_group_two::case_2_3;
> > +  using constructor_group_two::case_2_4;
> > +  /*
> > +  constexpr std::vector<int> case_4_1(case_2_1.begin(), case_2_1.end());
> > +  static_assert(case_4_1.size() == 0);
> > +
> > +  constexpr std::vector<int> case_4_2(case_2_2.begin(), case_2_2.end());
> > +  static_assert(case_4_2.size() == 1);
> > +  static_assert(case_4_2.at(0) == 2);
> > +
> > +  constexpr std::vector<int> case_4_3(case_2_3.begin(), case_2_3.end());
> > +  static_assert(case_4_3.size() == 2);
> > +  static_assert(case_4_3.at(0) == 3);
> > +  static_assert(case_4_3.at(1) == 3);
> > +
> > +  constexpr std::vector<int> case_4_4(case_2_4.begin(), case_2_4.end());
> > +  static_assert(case_4_4.size() == 5);
> > +  static_assert(case_4_4.at(0) == 4);
> > +  static_assert(case_4_4.at(1) == 4);
> > +  static_assert(case_4_4.at(2) == 4);
> > +  static_assert(case_4_4.at(3) == 4);
> > +  //*/
> > +}
> > +
> > +
> > +
> > +namespace constructor_group_five{
> > +  /*
> > +  using constructor_group_two::case_2_1;
> > +  using constructor_group_two::case_2_2;
> > +  using constructor_group_two::case_2_3;
> > +  using constructor_group_two::case_2_4;
> > +  /*
> > +  constexpr std::vector<int> case_5_1(case_2_1);
> > +  static_assert(case_5_1.size() == 0);
> > +
> > +  constexpr std::vector<int> case_5_2(case_2_2);
> > +  static_assert(case_5_2.size() == 1);
> > +  static_assert(case_5_2.at(0) == 2);
> > +
> > +  constexpr std::vector<int> case_5_3(case_2_3);
> > +  static_assert(case_5_3.size() == 2);
> > +  static_assert(case_5_3.at(0) == 3);
> > +  static_assert(case_5_3.at(1) == 3);
> > +
> > +  constexpr std::vector<int> case_5_4(case_2_4);
> > +  static_assert(case_5_4.size() == 4);
> > +  static_assert(case_5_4.at(0) == 4);
> > +  static_assert(case_5_4.at(1) == 4);
> > +  static_assert(case_5_4.at(2) == 4);
> > +  static_assert(case_5_4.at(3) == 4);
> > +  //*/
> > +}
> > +
> > +
> > +namespace constructor_group_eight{
> > +  /*
> > +  constexpr std::vector<int> case_8_1({});
> > +  static_assert(case_8_1.size() == 0);
> > +
> > +  constexpr std::vector<int> case_8_2({-1});
> > +  static_assert(case_8_2.size() == 1);
> > +  static_assert(case_8_2.at(0) == -1);
> > +
> > +  constexpr std::vector<int> case_8_3({-1, -2});
> > +  static_assert(case_8_3.size() == 2);
> > +  static_assert(case_8_3.at(0) == -1);
> > +  static_assert(case_8_3.at(1) == -2);
> > +
> > +  constexpr std::vector<int> case_8_4({-2, -1, 0, 1, 2});
> > +  static_assert(case_8_4.size() == 5);
> > +  static_assert(case_8_4.at(0) == -2);
> > +  static_assert(case_8_4.at(1) == -1);
> > +  static_assert(case_8_4.at(2) == 0);
> > +  static_assert(case_8_4.at(3) == 1);
> > +  static_assert(case_8_4.at(4) == 2);
> > +  //*/
> > +}
> > +
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/forward_iterators.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/forward_iterators.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/forward_iterators.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_assignment_operator.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_assignment_operator.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_assignment_operator.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_at.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_at.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_at.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_back.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_back.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_back.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_capacity.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_capacity.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_capacity.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_clear.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_clear.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_clear.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_data.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_data.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_data.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace_back.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace_back.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_emplace_back.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_empty.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_empty.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_empty.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_erase.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_erase.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_erase.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_front.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_front.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_front.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_index_access.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_index_access.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_index_access.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_insert.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_insert.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_insert.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_max_size.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_max_size.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_max_size.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_pop_back.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_pop_back.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_pop_back.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_push_back.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_push_back.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_push_back.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_reserve.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_reserve.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_reserve.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_resize.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_resize.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_resize.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_shrink_to_fit.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_shrink_to_fit.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_shrink_to_fit.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_size.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_size.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_size.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_swap.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_swap.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/function_swap.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_difference_type.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_difference_type.cc
> > new file mode 100644
> > index 00000000000..3e0b5b71542
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_difference_type.cc
> > @@ -0,0 +1,9 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > +/*
> > +#include<cstddef>
> > +#include<type_traits>
> > +#include<vector>
> > +
> > +static_assert(std::is_same<std::vector<int>::difference_type,
> > size_t>::value);
> > +*/
> > \ No newline at end of file
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_iterator.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_iterator.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_iterator.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_size_type.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_size_type.cc
> > new file mode 100644
> > index 00000000000..091c964d9e3
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_size_type.cc
> > @@ -0,0 +1,12 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > +/*
> > +#include<cstddef>
> > +#include<type_traits>
> > +#include<vector>
> > +
> > +
> > +static_assert(std::is_same<size_t, size_t>::value);
> > +
> > +static_assert(std::is_same<std::vector<int>::size_type, size_t>::value);
> > +*/
> > \ No newline at end of file
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_value_type.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_value_type.cc
> > new file mode 100644
> > index 00000000000..7bda8ad9264
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/member_value_type.cc
> > @@ -0,0 +1,13 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > +/*
> > +#include<type_traits>
> > +#include<vector>
> > +
> > +
> > +static_assert(std::is_same<int, int>::value);
> > +
> > +static_assert(std::is_same<std::vector<int>::value_type, int>::value);
> > +
> > +static_assert(!std::is_same<std::vector<char>::value_type, int>::value);
> > +*/
> > \ No newline at end of file
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_equality.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_equality.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_equality.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_than.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_than.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_than.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_then_or_equal.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_then_or_equal.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_greater_then_or_equal.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_inequality.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_inequality.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_inequality.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_than.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_than.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_than.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_then_or_equal.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_then_or_equal.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/operator_less_then_or_equal.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> >
> a/libstdc++-v3/testsuite/23_containers/vector/constexpr/reverse_iterators.cc
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/reverse_iterators.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> >
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/reverse_iterators.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_element.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_element.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_element.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
> > diff --git
> > a/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_vector.cc
> > b/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_vector.cc
> > new file mode 100644
> > index 00000000000..80465074309
> > --- /dev/null
> > +++
> b/libstdc++-v3/testsuite/23_containers/vector/constexpr/swap_vector.cc
> > @@ -0,0 +1,2 @@
> > +// { dg-do compile { target c++20 } }
> > +// { dg-options "-std=c++20" }
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Pointlessly fragile constexpr vector implementation I need some guidance on.
  2020-10-28  1:08 Pointlessly fragile constexpr vector implementation I need some guidance on Josh Marshall
       [not found] ` <CAJY4aWEeHrXjab-EnnYqaV12oOdSTOm3Wku4AGTWR-gFfKBcDA@mail.gmail.com>
@ 2020-10-30 11:33 ` Jonathan Wakely
  1 sibling, 0 replies; 3+ messages in thread
From: Jonathan Wakely @ 2020-10-30 11:33 UTC (permalink / raw)
  To: Josh Marshall; +Cc: gcc-help

On Wed, 28 Oct 2020 at 01:10, Josh Marshall via Gcc-help
<gcc-help@gcc.gnu.org> wrote:
>
> Hello all,
>
> This side project is definitely showing me a few of my shortcomings as a
> programmer, so please bear with me while I try to learn.  I have an
> implementation of constexpr vector which works in the null case, but fails
> on any case when it is constructed with contents or has contents added.

Let's discuss this on the libstdc++ mailing list, not gcc-help. I'll
reply there instead.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-10-30 11:33 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-28  1:08 Pointlessly fragile constexpr vector implementation I need some guidance on Josh Marshall
     [not found] ` <CAJY4aWEeHrXjab-EnnYqaV12oOdSTOm3Wku4AGTWR-gFfKBcDA@mail.gmail.com>
2020-10-28  2:38   ` Josh Marshall
2020-10-30 11:33 ` Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).