aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-02-21 20:47:43 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-02-21 20:47:43 +0000
commitd331c5f10d5e6c9f41a24ff7cb7a8c6493790885 (patch)
treed6fc9993cacf0943455f6d6d497ad7b32d0fdd5f
parentf43044a3d7856c6d8b88c706d1e078268e12f7af (diff)
downloadgcc-d331c5f10d5e6c9f41a24ff7cb7a8c6493790885.zip
gcc-d331c5f10d5e6c9f41a24ff7cb7a8c6493790885.tar.gz
gcc-d331c5f10d5e6c9f41a24ff7cb7a8c6493790885.tar.bz2
PR libstdc++/89416 fix __is_move_insertable trait
The common base class for __is_move_insertable and __is_copy_insertable instantiates both the copy and move tests, when only one is needed. The unneeded one might cause errors outside the immediate context. The solution used in this patch is to replace them with alias templates, which will only be instantiated as needed. PR libstdc++/89416 * include/bits/alloc_traits.h (__is_alloc_insertable_impl): Replace class template with class. Replace move and copy member types with member alias templates, so they are only instantiated when needed. (__is_copy_insertable, __is_move_insertable): Adjust base class. * testsuite/23_containers/vector/modifiers/push_back/89130.cc: Enable test for C++11/14/17 as well. * testsuite/23_containers/vector/modifiers/push_back/89416.cc: New test. From-SVN: r269075
-rw-r--r--libstdc++-v3/ChangeLog12
-rw-r--r--libstdc++-v3/include/bits/alloc_traits.h43
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89130.cc3
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89416.cc44
4 files changed, 78 insertions, 24 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index bd38976..fab28f4 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,15 @@
+2019-02-21 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/89416
+ * include/bits/alloc_traits.h (__is_alloc_insertable_impl): Replace
+ class template with class. Replace move and copy member types with
+ member alias templates, so they are only instantiated when needed.
+ (__is_copy_insertable, __is_move_insertable): Adjust base class.
+ * testsuite/23_containers/vector/modifiers/push_back/89130.cc: Enable
+ test for C++11/14/17 as well.
+ * testsuite/23_containers/vector/modifiers/push_back/89416.cc: New
+ test.
+
2019-02-20 Jakub Jelinek <jakub@redhat.com>
PR libstdc++/89402
diff --git a/libstdc++-v3/include/bits/alloc_traits.h b/libstdc++-v3/include/bits/alloc_traits.h
index 3b0c16f..71892cb 100644
--- a/libstdc++-v3/include/bits/alloc_traits.h
+++ b/libstdc++-v3/include/bits/alloc_traits.h
@@ -576,33 +576,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__do_alloc_on_swap(__one, __two, __pocs());
}
- template<typename _Alloc>
- class __is_alloc_insertable_impl
- {
- using _Traits = allocator_traits<_Alloc>;
- using value_type = typename _Traits::value_type;
-
- template<typename _Up, typename _Tp = __remove_cvref_t<_Up>,
- typename
- = decltype(_Traits::construct(std::declval<_Alloc&>(),
- std::declval<_Tp*>(),
- std::declval<_Up>()))>
- static true_type
- _M_select(int);
+ class __is_alloc_insertable_impl
+ {
+ template<typename _Alloc, typename _Up,
+ typename _Tp = __remove_cvref_t<_Up>,
+ typename = decltype(allocator_traits<_Alloc>::construct(
+ std::declval<_Alloc&>(), std::declval<_Tp*>(),
+ std::declval<_Up>()))>
+ static true_type
+ _M_select(int);
+
+ template<typename, typename>
+ static false_type
+ _M_select(...);
- template<typename _Up>
- static false_type
- _M_select(...);
+ protected:
+ template<typename _Alloc, typename _Tp = typename _Alloc::value_type>
+ using copy = decltype(_M_select<_Alloc, const _Tp&>(0));
- public:
- using copy = decltype(_M_select<const value_type&>(0));
- using move = decltype(_M_select<value_type>(0));
- };
+ template<typename _Alloc, typename _Tp = typename _Alloc::value_type>
+ using move = decltype(_M_select<_Alloc, _Tp>(0));
+ };
// true if _Alloc::value_type is CopyInsertable into containers using _Alloc
template<typename _Alloc>
struct __is_copy_insertable
- : __is_alloc_insertable_impl<_Alloc>::copy
+ : __is_alloc_insertable_impl::template copy<_Alloc>
{ };
// std::allocator<_Tp> just requires CopyConstructible
@@ -614,7 +613,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// true if _Alloc::value_type is MoveInsertable into containers using _Alloc
template<typename _Alloc>
struct __is_move_insertable
- : __is_alloc_insertable_impl<_Alloc>::move
+ : __is_alloc_insertable_impl::template move<_Alloc>
{ };
// std::allocator<_Tp> just requires MoveConstructible
diff --git a/libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89130.cc b/libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89130.cc
index 54b3f53..1a34f3e 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89130.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89130.cc
@@ -15,8 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++2a" }
-// { dg-do compile { target c++2a } }
+// { dg-do compile { target c++11 } }
#include <vector>
diff --git a/libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89416.cc b/libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89416.cc
new file mode 100644
index 0000000..b107761
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/89416.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+// PR libstdc++/89416
+
+#include <vector>
+
+template<typename T>
+ struct Alloc : std::allocator<T>
+ {
+ using std::allocator<T>::allocator;
+
+ template<typename U>
+ struct rebind { using other = Alloc<U>; };
+ };
+
+struct X
+{
+ X(int);
+ X(X&&);
+};
+
+void test01()
+{
+ std::vector<X, Alloc<X>> V;
+ V.push_back(X(1));
+ V.emplace_back(1);
+}