This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR c++/91369 Implement P0784R7 changes to allocation and construction


On 23/10/2019 21:27, Jonathan Wakely wrote:
This patch is the first part of library support for constexpr
std::vector and std::string. This only includes the changes to
std::allocator, std::allocator_traits, std::construct_at,
std::destroy_at, std::destroy and std::destroy_n.
[...]
Tested x86_64-linux and powerpc64le-linux, for every -std=gnu++NN
mode.

Clang (trunk, at least) with -std=c++11 now complains about some of the constexpr (because they return void, or don't have a return statement) when including <memory>.

What fixed it for me locally:

diff --git a/libstdc++-v3/include/bits/alloc_traits.h b/libstdc++-v3/include/bits/alloc_traits.h
index 26d6d26ae48..61d3c1b794b 100644
--- a/libstdc++-v3/include/bits/alloc_traits.h
+++ b/libstdc++-v3/include/bits/alloc_traits.h
@@ -241,13 +241,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  = typename __construct_helper<_Tp, _Args...>::type;
template<typename _Tp, typename... _Args>
-	static constexpr _Require<__has_construct<_Tp, _Args...>>
+	static
+#if __cplusplus >= 201402L
+	       constexpr
+#endif
+	                 _Require<__has_construct<_Tp, _Args...>>
 	_S_construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
 	noexcept(noexcept(__a.construct(__p, std::forward<_Args>(__args)...)))
 	{ __a.construct(__p, std::forward<_Args>(__args)...); }
template<typename _Tp, typename... _Args>
-	static constexpr
+	static
+#if __cplusplus >= 201402L
+	       constexpr
+#endif
 	_Require<__and_<__not_<__has_construct<_Tp, _Args...>>,
 			       is_constructible<_Tp, _Args...>>>
 	_S_construct(_Alloc&, _Tp* __p, _Args&&... __args)
@@ -256,14 +263,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	{ std::_Construct(__p, std::forward<_Args>(__args)...); }
template<typename _Alloc2, typename _Tp>
-	static constexpr auto
+	static
+#if __cplusplus >= 201402L
+	       constexpr
+#endif
+	                 auto
 	_S_destroy(_Alloc2& __a, _Tp* __p, int)
 	noexcept(noexcept(__a.destroy(__p)))
 	-> decltype(__a.destroy(__p))
 	{ __a.destroy(__p); }
template<typename _Alloc2, typename _Tp>
-	static constexpr void
+	static
+#if __cplusplus >= 201402L
+	       constexpr
+#endif
+	                 void
 	_S_destroy(_Alloc2&, _Tp* __p, ...)
 	noexcept(noexcept(__p->~_Tp()))
 	{ std::_Destroy(__p); }
@@ -562,7 +577,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
template<typename _Alloc>
-    constexpr void
+#if __cplusplus >= 201402L
+    constexpr
+#endif
+              void
     __alloc_on_copy(_Alloc& __one, const _Alloc& __two)
     {
       typedef allocator_traits<_Alloc> __traits;
@@ -594,7 +612,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
template<typename _Alloc>
-    constexpr void
+#if __cplusplus >= 201402L
+    constexpr
+#endif
+              void
     __alloc_on_move(_Alloc& __one, _Alloc& __two)
     {
       typedef allocator_traits<_Alloc> __traits;
@@ -621,7 +642,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
template<typename _Alloc>
-    constexpr void
+#if __cplusplus >= 201402L
+    constexpr
+#endif
+              void
     __alloc_on_swap(_Alloc& __one, _Alloc& __two)
     {
       typedef allocator_traits<_Alloc> __traits;
diff --git a/libstdc++-v3/include/bits/stl_construct.h b/libstdc++-v3/include/bits/stl_construct.h
index a16196ffe74..ed9b72b7327 100644
--- a/libstdc++-v3/include/bits/stl_construct.h
+++ b/libstdc++-v3/include/bits/stl_construct.h
@@ -137,7 +137,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
    * Destroy the object pointed to by a pointer type.
    */
   template<typename _Tp>
-    _GLIBCXX_CONSTEXPR inline void
+#if __cplusplus >= 201402L
+    _GLIBCXX_CONSTEXPR
+#endif
+                       inline void
     _Destroy(_Tp* __pointer)
     {
 #if __cplusplus > 201703L
diff --git a/libstdc++-v3/include/ext/alloc_traits.h b/libstdc++-v3/include/ext/alloc_traits.h
index 052d811ec01..ddeda66b57a 100644
--- a/libstdc++-v3/include/ext/alloc_traits.h
+++ b/libstdc++-v3/include/ext/alloc_traits.h
@@ -76,7 +76,11 @@ template<typename _Alloc, typename = typename _Alloc::value_type>
   public:
     // overload construct for non-standard pointer types
     template<typename _Ptr, typename... _Args>
-      static constexpr std::__enable_if_t<__is_custom_pointer<_Ptr>::value>
+      static
+#if __cplusplus >= 201402L
+             constexpr
+#endif
+                       std::__enable_if_t<__is_custom_pointer<_Ptr>::value>
       construct(_Alloc& __a, _Ptr __p, _Args&&... __args)
       noexcept(noexcept(_Base_type::construct(__a, std::__to_address(__p),
 					      std::forward<_Args>(__args)...)))
@@ -87,7 +91,11 @@ template<typename _Alloc, typename = typename _Alloc::value_type>
// overload destroy for non-standard pointer types
     template<typename _Ptr>
-      static constexpr std::__enable_if_t<__is_custom_pointer<_Ptr>::value>
+      static
+#if __cplusplus >= 201402L
+             constexpr
+#endif
+                       std::__enable_if_t<__is_custom_pointer<_Ptr>::value>
       destroy(_Alloc& __a, _Ptr __p)
       noexcept(noexcept(_Base_type::destroy(__a, std::__to_address(__p))))
       { _Base_type::destroy(__a, std::__to_address(__p)); }
@@ -95,7 +103,11 @@ template<typename _Alloc, typename = typename _Alloc::value_type>
     static constexpr _Alloc _S_select_on_copy(const _Alloc& __a)
     { return _Base_type::select_on_container_copy_construction(__a); }
- static constexpr void _S_on_swap(_Alloc& __a, _Alloc& __b)
+    static
+#if __cplusplus >= 201402L
+           constexpr
+#endif
+                     void _S_on_swap(_Alloc& __a, _Alloc& __b)
     { std::__alloc_on_swap(__a, __b); }
static constexpr bool _S_propagate_on_copy_assign()


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]