mirror of git://gcc.gnu.org/git/gcc.git
PR libstdc++/55977 (partial, std::vector and std::deque bits)
2013-03-18 Paolo Carlini <paolo.carlini@oracle.com> PR libstdc++/55977 (partial, std::vector and std::deque bits) * include/bits/stl_vector.h (_M_range_initialize(_InputIterator, _InputIterator, std::input_iterator_tag)): Use emplace_back. * include/bits/deque.tcc (_M_range_initialize(_InputIterator, _InputIterator, std::input_iterator_tag)): Likewise. * testsuite/23_containers/vector/cons/55977.cc: New. * testsuite/23_containers/deque/cons/55977.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Adjust dg-error line number. * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Likewise. From-SVN: r196774
This commit is contained in:
parent
9fa5223135
commit
ad6fdc1976
|
|
@ -1,3 +1,17 @@
|
||||||
|
2013-03-18 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
|
PR libstdc++/55977 (partial, std::vector and std::deque bits)
|
||||||
|
* include/bits/stl_vector.h (_M_range_initialize(_InputIterator,
|
||||||
|
_InputIterator, std::input_iterator_tag)): Use emplace_back.
|
||||||
|
* include/bits/deque.tcc (_M_range_initialize(_InputIterator,
|
||||||
|
_InputIterator, std::input_iterator_tag)): Likewise.
|
||||||
|
* testsuite/23_containers/vector/cons/55977.cc: New.
|
||||||
|
* testsuite/23_containers/deque/cons/55977.cc: Likewise.
|
||||||
|
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
|
||||||
|
Adjust dg-error line number.
|
||||||
|
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
|
||||||
|
Likewise.
|
||||||
|
|
||||||
2013-03-17 Paolo Carlini <paolo.carlini@oracle.com>
|
2013-03-17 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR libstdc++/55979
|
PR libstdc++/55979
|
||||||
|
|
|
||||||
|
|
@ -381,7 +381,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||||
__try
|
__try
|
||||||
{
|
{
|
||||||
for (; __first != __last; ++__first)
|
for (; __first != __last; ++__first)
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
emplace_back(*__first);
|
||||||
|
#else
|
||||||
push_back(*__first);
|
push_back(*__first);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
__catch(...)
|
__catch(...)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1184,7 +1184,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||||
_InputIterator __last, std::input_iterator_tag)
|
_InputIterator __last, std::input_iterator_tag)
|
||||||
{
|
{
|
||||||
for (; __first != __last; ++__first)
|
for (; __first != __last; ++__first)
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
emplace_back(*__first);
|
||||||
|
#else
|
||||||
push_back(*__first);
|
push_back(*__first);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called by the second initialize_dispatch above
|
// Called by the second initialize_dispatch above
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
// { dg-do compile }
|
||||||
|
// { dg-options "-std=gnu++11" }
|
||||||
|
|
||||||
|
// Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <utility>
|
||||||
|
#include <deque>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct MyAllocator
|
||||||
|
{
|
||||||
|
std::allocator<T> base;
|
||||||
|
typedef T value_type;
|
||||||
|
|
||||||
|
// FIXME: these types shouldn't be required.
|
||||||
|
typedef T* pointer;
|
||||||
|
typedef const T* const_pointer;
|
||||||
|
typedef T& reference;
|
||||||
|
typedef const T& const_reference;
|
||||||
|
template <typename U>
|
||||||
|
struct rebind
|
||||||
|
{ typedef MyAllocator<U> other; };
|
||||||
|
|
||||||
|
MyAllocator() = default;
|
||||||
|
template <class U>
|
||||||
|
MyAllocator(const MyAllocator<U>& other) : base(other.base) {}
|
||||||
|
T* allocate(std::size_t n) { return base.allocate(n); }
|
||||||
|
void deallocate(T* p, std::size_t n) { return base.deallocate(p, n); }
|
||||||
|
template <class U, class... Args>
|
||||||
|
void construct(U* p, Args&&... args)
|
||||||
|
{
|
||||||
|
::new (static_cast<void*>(p)) U(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
friend class MyAllocator<A>;
|
||||||
|
A(int value) : value(value) {}
|
||||||
|
int value;
|
||||||
|
public:
|
||||||
|
A() : value() {}
|
||||||
|
int get() const { return value; }
|
||||||
|
};
|
||||||
|
|
||||||
|
void foo()
|
||||||
|
{
|
||||||
|
std::deque<A, MyAllocator<A>> v1;
|
||||||
|
const int i = 1;
|
||||||
|
v1.emplace_back(i); // OK
|
||||||
|
std::deque<A, MyAllocator<A>> v2(std::istream_iterator<int>(), {}); // ERROR
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// { dg-do compile }
|
||||||
|
// { dg-options "-std=gnu++11" }
|
||||||
|
|
||||||
|
// Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct MyAllocator
|
||||||
|
{
|
||||||
|
std::allocator<T> base;
|
||||||
|
typedef T value_type;
|
||||||
|
MyAllocator() = default;
|
||||||
|
template <class U>
|
||||||
|
MyAllocator(const MyAllocator<U>& other) : base(other.base) {}
|
||||||
|
T* allocate(std::size_t n) { return base.allocate(n); }
|
||||||
|
void deallocate(T* p, std::size_t n) { return base.deallocate(p, n); }
|
||||||
|
template <class U, class... Args>
|
||||||
|
void construct(U* p, Args&&... args)
|
||||||
|
{
|
||||||
|
::new (static_cast<void*>(p)) U(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
friend class MyAllocator<A>;
|
||||||
|
A(int value) : value(value) {}
|
||||||
|
int value;
|
||||||
|
public:
|
||||||
|
A() : value() {}
|
||||||
|
int get() const { return value; }
|
||||||
|
};
|
||||||
|
|
||||||
|
void foo()
|
||||||
|
{
|
||||||
|
std::vector<A, MyAllocator<A>> v1;
|
||||||
|
const int i = 1;
|
||||||
|
v1.emplace_back(i); // OK
|
||||||
|
std::vector<A, MyAllocator<A>> v2(std::istream_iterator<int>(), {}); // ERROR
|
||||||
|
}
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// { dg-do compile }
|
// { dg-do compile }
|
||||||
// { dg-error "no matching" "" { target *-*-* } 1236 }
|
// { dg-error "no matching" "" { target *-*-* } 1240 }
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// { dg-do compile }
|
// { dg-do compile }
|
||||||
// { dg-error "no matching" "" { target *-*-* } 1277 }
|
// { dg-error "no matching" "" { target *-*-* } 1281 }
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue