If we make this test allocator usable in constant expressions then we'll
get an error if the 'state' data member isn't initialized. This makes it
a more reliable check that allocators are correctly value-initialized
when they're required to be.

libstdc++-v3/ChangeLog:

        * testsuite/23_containers/vector/allocator/default_init.cc:
        Add a check using constant evaluation.
        * testsuite/23_containers/vector/bool/allocator/default_init.cc:
        Likewise.
        * testsuite/util/testsuite_allocator.h (default_init_allocator):
        Make all member functions and equality ops constexpr.
---

Tested x86_64-linux. Pushed to trunk.

 .../vector/allocator/default_init.cc            | 11 +++++++++++
 .../vector/bool/allocator/default_init.cc       | 11 +++++++++++
 .../testsuite/util/testsuite_allocator.h        | 17 ++++++++++-------
 3 files changed, 32 insertions(+), 7 deletions(-)

diff --git 
a/libstdc++-v3/testsuite/23_containers/vector/allocator/default_init.cc 
b/libstdc++-v3/testsuite/23_containers/vector/allocator/default_init.cc
index 195cd2dca54..486c44c9699 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/allocator/default_init.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/allocator/default_init.cc
@@ -59,6 +59,17 @@ void test02()
   tmp->~test_type();
 }
 
+#ifdef __cpp_lib_constexpr_vector
+constexpr bool
+test03()
+{
+  using alloc_type = default_init_allocator<T>;
+  std::vector<T, alloc_type> v;
+  return v.get_allocator().state == 0;
+}
+static_assert( test03() );
+#endif
+
 int main()
 {
   test01();
diff --git 
a/libstdc++-v3/testsuite/23_containers/vector/bool/allocator/default_init.cc 
b/libstdc++-v3/testsuite/23_containers/vector/bool/allocator/default_init.cc
index 3914b7fe6c3..c95cb6ba99f 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/bool/allocator/default_init.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/bool/allocator/default_init.cc
@@ -59,6 +59,17 @@ void test02()
   tmp->~test_type();
 }
 
+#ifdef __cpp_lib_constexpr_vector
+constexpr bool
+test03()
+{
+  using alloc_type = default_init_allocator<T>;
+  std::vector<T, alloc_type> v;
+  return v.get_allocator().state == 0;
+}
+static_assert( test03() );
+#endif
+
 int main()
 {
   test01();
diff --git a/libstdc++-v3/testsuite/util/testsuite_allocator.h 
b/libstdc++-v3/testsuite/util/testsuite_allocator.h
index be596bf00fb..e5ffad2ba58 100644
--- a/libstdc++-v3/testsuite/util/testsuite_allocator.h
+++ b/libstdc++-v3/testsuite/util/testsuite_allocator.h
@@ -541,15 +541,16 @@ namespace __gnu_test
       default_init_allocator() = default;
 
       template<typename U>
+       constexpr
         default_init_allocator(const default_init_allocator<U>& a)
          : state(a.state)
         { }
 
-      T*
+      constexpr T*
       allocate(std::size_t n)
       { return std::allocator<T>().allocate(n); }
 
-      void
+      constexpr void
       deallocate(T* p, std::size_t n)
       { std::allocator<T>().deallocate(p, n); }
 
@@ -557,15 +558,17 @@ namespace __gnu_test
     };
 
   template<typename T, typename U>
-    bool operator==(const default_init_allocator<T>& t,
-                   const default_init_allocator<U>& u)
+    constexpr bool
+    operator==(const default_init_allocator<T>& t,
+              const default_init_allocator<U>& u)
     { return t.state == u.state; }
 
   template<typename T, typename U>
-    bool operator!=(const default_init_allocator<T>& t,
-                   const default_init_allocator<U>& u)
+    constexpr bool
+    operator!=(const default_init_allocator<T>& t,
+              const default_init_allocator<U>& u)
     { return !(t == u); }
-#endif
+#endif // C++11
 
   template<typename Tp>
     struct ExplicitConsAlloc : std::allocator<Tp>
-- 
2.49.0

Reply via email to