mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-08 00:01:19 +08:00
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>
|
||||
|
||||
PR libstdc++/55979
|
||||
|
@ -381,7 +381,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||
__try
|
||||
{
|
||||
for (; __first != __last; ++__first)
|
||||
#if __cplusplus >= 201103L
|
||||
emplace_back(*__first);
|
||||
#else
|
||||
push_back(*__first);
|
||||
#endif
|
||||
}
|
||||
__catch(...)
|
||||
{
|
||||
|
@ -1184,7 +1184,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||
_InputIterator __last, std::input_iterator_tag)
|
||||
{
|
||||
for (; __first != __last; ++__first)
|
||||
#if __cplusplus >= 201103L
|
||||
emplace_back(*__first);
|
||||
#else
|
||||
push_back(*__first);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Called by the second initialize_dispatch above
|
||||
|
70
libstdc++-v3/testsuite/23_containers/deque/cons/55977.cc
Normal file
70
libstdc++-v3/testsuite/23_containers/deque/cons/55977.cc
Normal file
@ -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
|
||||
}
|
60
libstdc++-v3/testsuite/23_containers/vector/cons/55977.cc
Normal file
60
libstdc++-v3/testsuite/23_containers/vector/cons/55977.cc
Normal file
@ -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/>.
|
||||
|
||||
// { dg-do compile }
|
||||
// { dg-error "no matching" "" { target *-*-* } 1236 }
|
||||
// { dg-error "no matching" "" { target *-*-* } 1240 }
|
||||
|
||||
#include <vector>
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-do compile }
|
||||
// { dg-error "no matching" "" { target *-*-* } 1277 }
|
||||
// { dg-error "no matching" "" { target *-*-* } 1281 }
|
||||
|
||||
#include <vector>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user