LWG 3035. std::allocator's constructors should be constexpr
authorJonathan Wakely <jwakely@redhat.com>
Mon, 18 Jun 2018 15:47:07 +0000 (16:47 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 18 Jun 2018 15:47:07 +0000 (16:47 +0100)
LWG 3035. std::allocator's constructors should be constexpr
* include/bits/allocator.h (allocator): Add constexpr to constructors
for C++2a. Replace dynamic exception specifications with NOTHROW
macro.
(allocator, operator==, operator!=): Replace USE_NOEXCEPT macro with
NOTHROW.
* include/bits/c++config (_GLIBCXX20_CONSTEXPR): Define.
* include/ext/malloc_allocator.h (malloc_allocator): Add constexpr
to constructors for C++2a.
* include/ext/new_allocator.h (new_allocator): Likewise.

From-SVN: r261703

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/allocator.h
libstdc++-v3/include/bits/c++config
libstdc++-v3/include/ext/malloc_allocator.h
libstdc++-v3/include/ext/new_allocator.h

index 2c3237a2ed222eaf0c5b26c3bbe93d9f73e64d08..166522ccedffc32dcca5a1850f2596f8e156a9b1 100644 (file)
@@ -1,3 +1,16 @@
+2018-06-18  Jonathan Wakely  <jwakely@redhat.com>
+
+       LWG 3035. std::allocator's constructors should be constexpr
+       * include/bits/allocator.h (allocator): Add constexpr to constructors
+       for C++2a. Replace dynamic exception specifications with NOTHROW
+       macro.
+       (allocator, operator==, operator!=): Replace USE_NOEXCEPT macro with
+       NOTHROW.
+       * include/bits/c++config (_GLIBCXX20_CONSTEXPR): Define.
+       * include/ext/malloc_allocator.h (malloc_allocator): Add constexpr
+       to constructors for C++2a.
+       * include/ext/new_allocator.h (new_allocator): Likewise.
+
 2018-06-16  Jonathan Wakely  <jwakely@redhat.com>
 
        LWG 3076 basic_string CTAD ambiguity
index 2da499f1498b83c566710b6c5f2764293219f9bf..c4e3a4b9c15d65675292b875b0ef4d656f1a4ef1 100644 (file)
@@ -128,19 +128,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef true_type is_always_equal;
 #endif
 
-      allocator() throw() { }
+      // _GLIBCXX_RESOLVE_LIB_DEFECTS
+      // 3035. std::allocator's constructors should be constexpr
+      _GLIBCXX20_CONSTEXPR
+      allocator() _GLIBCXX_NOTHROW { }
 
-      allocator(const allocator& __a) throw()
+      _GLIBCXX20_CONSTEXPR
+      allocator(const allocator& __a) _GLIBCXX_NOTHROW
       : __allocator_base<_Tp>(__a) { }
+
 #if __cplusplus >= 201103L
       // Avoid implicit deprecation.
       allocator& operator=(const allocator&) = default;
 #endif
 
       template<typename _Tp1>
-       allocator(const allocator<_Tp1>&) throw() { }
+       _GLIBCXX20_CONSTEXPR
+       allocator(const allocator<_Tp1>&) _GLIBCXX_NOTHROW { }
 
-      ~allocator() throw() { }
+      ~allocator() _GLIBCXX_NOTHROW { }
 
       // Inherit everything else.
     };
@@ -148,25 +154,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _T1, typename _T2>
     inline bool
     operator==(const allocator<_T1>&, const allocator<_T2>&)
-    _GLIBCXX_USE_NOEXCEPT
+    _GLIBCXX_NOTHROW
     { return true; }
 
   template<typename _Tp>
     inline bool
     operator==(const allocator<_Tp>&, const allocator<_Tp>&)
-    _GLIBCXX_USE_NOEXCEPT
+    _GLIBCXX_NOTHROW
     { return true; }
 
   template<typename _T1, typename _T2>
     inline bool
     operator!=(const allocator<_T1>&, const allocator<_T2>&)
-    _GLIBCXX_USE_NOEXCEPT
+    _GLIBCXX_NOTHROW
     { return false; }
 
   template<typename _Tp>
     inline bool
     operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
-    _GLIBCXX_USE_NOEXCEPT
+    _GLIBCXX_NOTHROW
     { return false; }
 
   // Invalid allocator<cv T> partial specializations.
index 838afc59dfb1889834bf5d97725ad77f0e42b9a6..4a096a198dbe7ed113764bf1d06f7cfa264df2e3 100644 (file)
 #endif
 
 #ifndef _GLIBCXX17_CONSTEXPR
-# if __cplusplus > 201402L
+# if __cplusplus >= 201703L
 #  define _GLIBCXX17_CONSTEXPR constexpr
 # else
 #  define _GLIBCXX17_CONSTEXPR
 # endif
 #endif
 
+#ifndef _GLIBCXX20_CONSTEXPR
+# if __cplusplus > 201703L
+#  define _GLIBCXX20_CONSTEXPR constexpr
+# else
+#  define _GLIBCXX20_CONSTEXPR
+# endif
+#endif
+
 #ifndef _GLIBCXX17_INLINE
-# if __cplusplus > 201402L
+# if __cplusplus >= 201703L
 #  define _GLIBCXX17_INLINE inline
 # else
 #  define _GLIBCXX17_INLINE
index 75a74a39cefa6baa61a9522c8d06bc93c7d7cd86..8739c1fdaa3e40b306d8ea6a60a36f31332100e1 100644 (file)
@@ -75,11 +75,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef std::true_type propagate_on_container_move_assignment;
 #endif
 
+      _GLIBCXX20_CONSTEXPR
       malloc_allocator() _GLIBCXX_USE_NOEXCEPT { }
 
+      _GLIBCXX20_CONSTEXPR
       malloc_allocator(const malloc_allocator&) _GLIBCXX_USE_NOEXCEPT { }
 
       template<typename _Tp1>
+       _GLIBCXX20_CONSTEXPR
         malloc_allocator(const malloc_allocator<_Tp1>&)
        _GLIBCXX_USE_NOEXCEPT { }
 
index 78e2019a0b3ae162c36b005b978afd0ed670263a..19e7ad02e75d64a1167dd6e6aea227730eeb8d85 100644 (file)
@@ -76,11 +76,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef std::true_type propagate_on_container_move_assignment;
 #endif
 
+      _GLIBCXX20_CONSTEXPR
       new_allocator() _GLIBCXX_USE_NOEXCEPT { }
 
+      _GLIBCXX20_CONSTEXPR
       new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
 
       template<typename _Tp1>
+       _GLIBCXX20_CONSTEXPR
        new_allocator(const new_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
 
       ~new_allocator() _GLIBCXX_USE_NOEXCEPT { }