aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2007-05-31 11:13:57 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2007-05-31 11:13:57 +0000
commitf4c5578ffbdaf421e70882c6cafc63f32faa30d1 (patch)
tree94d2132a022b2a210e815336da045b2165e41d13
parentb1ae209ca96f6fb9a32c56212c899d5bab399647 (diff)
downloadgcc-f4c5578ffbdaf421e70882c6cafc63f32faa30d1.zip
gcc-f4c5578ffbdaf421e70882c6cafc63f32faa30d1.tar.gz
gcc-f4c5578ffbdaf421e70882c6cafc63f32faa30d1.tar.bz2
PR c++/32158 (libstdc++ bits)
2007-05-31 Paolo Carlini <pcarlini@suse.de> PR c++/32158 (libstdc++ bits) * include/bits/stl_uninitialized.h (__uninitialized_copy_aux, __uninitialized_fill_aux, __uninitialized_fill_n_aux): Remove. (struct __uninitialized_copy, struct __uninitialized_fill, struct __uninitialized_fill_n): Add. (uninitialized_copy, uninitialized_fill, uninitialized_fill_n): Adjust. * testsuite/20_util/specialized_algorithms/32158.cc: New. * include/bits/stl_uninitialized.h (uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator)): Robustify vs non-POD input. * include/bits/stl_vector.h (_M_fill_initialize): New. (vector(size_type, const value_type&, const allocator_type&), _M_initialize_dispatch(_Integer, _Integer, __true_type)): Use it. * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Adjust dg-error line. * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/ constructor_1_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/ constructor_2_neg.cc: Likewise. From-SVN: r125223
-rw-r--r--libstdc++-v3/ChangeLog27
-rw-r--r--libstdc++-v3/include/bits/stl_uninitialized.h162
-rw-r--r--libstdc++-v3/include/bits/stl_vector.h21
-rw-r--r--libstdc++-v3/testsuite/20_util/specialized_algorithms/32158.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc2
8 files changed, 178 insertions, 75 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index c4bdb2c..4259ef3 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,30 @@
+2007-05-31 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/32158 (libstdc++ bits)
+ * include/bits/stl_uninitialized.h (__uninitialized_copy_aux,
+ __uninitialized_fill_aux, __uninitialized_fill_n_aux):
+ Remove.
+ (struct __uninitialized_copy, struct __uninitialized_fill,
+ struct __uninitialized_fill_n): Add.
+ (uninitialized_copy, uninitialized_fill, uninitialized_fill_n):
+ Adjust.
+ * testsuite/20_util/specialized_algorithms/32158.cc: New.
+
+ * include/bits/stl_uninitialized.h (uninitialized_copy(_InputIterator,
+ _InputIterator, _ForwardIterator)): Robustify vs non-POD input.
+
+ * include/bits/stl_vector.h (_M_fill_initialize): New.
+ (vector(size_type, const value_type&, const allocator_type&),
+ _M_initialize_dispatch(_Integer, _Integer, __true_type)): Use it.
+ * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
+ Adjust dg-error line.
+ * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
+ Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/
+ constructor_1_neg.cc: Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/
+ constructor_2_neg.cc: Likewise.
+
2007-05-29 Paolo Carlini <pcarlini@suse.de>
* aclocal.m4: Regenerate.
diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h b/libstdc++-v3/include/bits/stl_uninitialized.h
index 8b5548e..c564c21 100644
--- a/libstdc++-v3/include/bits/stl_uninitialized.h
+++ b/libstdc++-v3/include/bits/stl_uninitialized.h
@@ -64,25 +64,38 @@
_GLIBCXX_BEGIN_NAMESPACE(std)
- template<typename _InputIterator, typename _ForwardIterator>
- _ForwardIterator
- __uninitialized_copy_aux(_InputIterator __first,
- _InputIterator __last,
- _ForwardIterator __result)
+ template<bool>
+ struct __uninitialized_copy
{
- _ForwardIterator __cur = __result;
- try
- {
- for (; __first != __last; ++__first, ++__cur)
- std::_Construct(&*__cur, *__first);
- return __cur;
- }
- catch(...)
- {
- std::_Destroy(__result, __cur);
- __throw_exception_again;
+ template<typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ _ForwardIterator __cur = __result;
+ try
+ {
+ for (; __first != __last; ++__first, ++__cur)
+ std::_Construct(&*__cur, *__first);
+ return __cur;
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __cur);
+ __throw_exception_again;
+ }
}
- }
+ };
+
+ template<>
+ struct __uninitialized_copy<true>
+ {
+ template<typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ { return std::copy(__first, __last, __result); }
+ };
/**
* @brief Copies the range [first,last) into result.
@@ -98,33 +111,48 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
uninitialized_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _ValueType1;
typedef typename iterator_traits<_ForwardIterator>::value_type
- _ValueType;
- if (__is_pod(_ValueType))
- return std::copy(__first, __last, __result);
- else
- return std::__uninitialized_copy_aux(__first, __last, __result);
+ _ValueType2;
+
+ return std::__uninitialized_copy<(__is_pod(_ValueType1)
+ && __is_pod(_ValueType2))>::
+ uninitialized_copy(__first, __last, __result);
}
- template<typename _ForwardIterator, typename _Tp>
- void
- __uninitialized_fill_aux(_ForwardIterator __first,
- _ForwardIterator __last,
- const _Tp& __x)
+ template<bool>
+ struct __uninitialized_fill
{
- _ForwardIterator __cur = __first;
- try
- {
- for (; __cur != __last; ++__cur)
- std::_Construct(&*__cur, __x);
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ uninitialized_fill(_ForwardIterator __first,
+ _ForwardIterator __last, const _Tp& __x)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __cur != __last; ++__cur)
+ std::_Construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ __throw_exception_again;
+ }
}
- catch(...)
- {
- std::_Destroy(__first, __cur);
- __throw_exception_again;
- }
- }
+ };
+
+ template<>
+ struct __uninitialized_fill<true>
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ uninitialized_fill(_ForwardIterator __first,
+ _ForwardIterator __last, const _Tp& __x)
+ { std::fill(__first, __last, __x); }
+ };
/**
* @brief Copies the value x into the range [first,last).
@@ -142,30 +170,43 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
- if (__is_pod(_ValueType))
- std::fill(__first, __last, __x);
- else
- std::__uninitialized_fill_aux(__first, __last, __x);
+
+ std::__uninitialized_fill<__is_pod(_ValueType)>::
+ uninitialized_fill(__first, __last, __x);
}
- template<typename _ForwardIterator, typename _Size, typename _Tp>
- void
- __uninitialized_fill_n_aux(_ForwardIterator __first, _Size __n,
- const _Tp& __x)
+ template<bool>
+ struct __uninitialized_fill_n
{
- _ForwardIterator __cur = __first;
- try
- {
- for (; __n > 0; --__n, ++__cur)
- std::_Construct(&*__cur, __x);
- }
- catch(...)
- {
- std::_Destroy(__first, __cur);
- __throw_exception_again;
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ static void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n,
+ const _Tp& __x)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __n > 0; --__n, ++__cur)
+ std::_Construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ __throw_exception_again;
+ }
}
- }
+ };
+
+ template<>
+ struct __uninitialized_fill_n<true>
+ {
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ static void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n,
+ const _Tp& __x)
+ { std::fill_n(__first, __n, __x); }
+ };
/**
* @brief Copies the value x into the range [first,first+n).
@@ -182,10 +223,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
- if (__is_pod(_ValueType))
- std::fill_n(__first, __n, __x);
- else
- std::__uninitialized_fill_n_aux(__first, __n, __x);
+
+ std::__uninitialized_fill_n<__is_pod(_ValueType)>::
+ uninitialized_fill_n(__first, __n, __x);
}
// Extensions: versions of uninitialized_copy, uninitialized_fill,
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h
index 93843f0a..f885f02 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -210,11 +210,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
vector(size_type __n, const value_type& __value = value_type(),
const allocator_type& __a = allocator_type())
: _Base(__n, __a)
- {
- std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
- _M_get_Tp_allocator());
- this->_M_impl._M_finish = this->_M_impl._M_start + __n;
- }
+ { _M_fill_initialize(__n, __value); }
/**
* @brief %Vector copy constructor.
@@ -788,11 +784,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
this->_M_impl._M_start = _M_allocate(static_cast<size_type>(__n));
this->_M_impl._M_end_of_storage =
this->_M_impl._M_start + static_cast<size_type>(__n);
- std::__uninitialized_fill_n_a(this->_M_impl._M_start,
- static_cast<size_type>(__n),
- __value,
- _M_get_Tp_allocator());
- this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
+ _M_fill_initialize(static_cast<size_type>(__n), __value);
}
// Called by the range constructor to implement [23.1.1]/9
@@ -831,6 +823,15 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
_M_get_Tp_allocator());
}
+ // Called by the first initialize_dispatch above and by the
+ // vector(n,value,a) constructor.
+ _M_fill_initialize(size_type __n, const value_type& __value)
+ {
+ std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
+ _M_get_Tp_allocator());
+ this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
+ }
+
// Internal assign functions follow. The *_aux functions do the actual
// assignment work for the range versions.
diff --git a/libstdc++-v3/testsuite/20_util/specialized_algorithms/32158.cc b/libstdc++-v3/testsuite/20_util/specialized_algorithms/32158.cc
new file mode 100644
index 0000000..1f9867e
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/specialized_algorithms/32158.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2007 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 2, 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 COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 20.4.4 specialized algorithms
+
+// { dg-do compile }
+
+#include <memory>
+#include <utility>
+
+// c++/32158
+
+typedef std::pair<const int, int> MyPair;
+
+void
+Alpha(MyPair* start, MyPair* end)
+{
+ MyPair my_pair(1, 2);
+ std::uninitialized_fill(start, end, my_pair);
+};
diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
index 873c27f..f076afe 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
@@ -19,7 +19,7 @@
// USA.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 845 }
+// { dg-error "no matching" "" { target *-*-* } 846 }
// { dg-excess-errors "" }
#include <vector>
diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
index 79e339d..12aa0ae 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
@@ -19,7 +19,7 @@
// USA.
// { dg-do compile }
-// { dg-error "no match" "" { target *-*-* } 622 }
+// { dg-error "no matching" "" { target *-*-* } 787 }
// { dg-excess-errors "" }
#include <vector>
diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
index bcc4f47..1dd8d30 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
@@ -19,7 +19,7 @@
// USA.
// { dg-do compile }
-// { dg-error "no match" "" { target *-*-* } 622 }
+// { dg-error "no matching" "" { target *-*-* } 787 }
// { dg-excess-errors "" }
#include <vector>
diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc
index c82a5c4..be39739 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc
@@ -19,7 +19,7 @@
// USA.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 886 }
+// { dg-error "no matching" "" { target *-*-* } 887 }
// { dg-excess-errors "" }
#include <vector>