+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
__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
// 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
--- /dev/null
+// 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);
+}