diff options
author | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-05-16 15:29:56 +0000 |
---|---|---|
committer | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-05-16 15:29:56 +0000 |
commit | b8f311f40347abb6621e45f8a3ae6ac20d923ed0 (patch) | |
tree | c320e7e8a356f020231ccc70c995f00aec70b058 /libstdc++-v3 | |
parent | 90eefc2611833548e7275ed6d174f76d7d23e875 (diff) |
Merge from gcc-4_7-branch
Merged revisions 186891,186899-186900,186912,186914,186916,186924,186927,186930,186932,186937,186951,186959,186962,186987,186995-186997,186999,187006,187011,187023,187033,187036,187039,187044,187057,187071,187080,187086,187088,187091,187098,187104,187109,187112,187124,187130,187132,187143-187144,187152,187154,187162,187164,187169,187177,187182,187187,187193,187202,187205,187216,187222,187232,187237,187241,187263,187265,187267,187274,187278,187285-187286,187306,187339,187343,187357,187361,187370,187378-187379,187390,187409,187417,187422,187430,187433,187439,187448,187474,187476,187482,187486,187492,187496-187497 via svnmerge from
svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch
=======================================================================
Bugs fixed (http://gcc.gnu.org/bugzilla)
Codegen
52999, 53084, 52804
Optimizers
53085, 53136, 53160, 53163, 53144, 48496, 52633, 53195
C
52880, 51527
x86
53138, 53228, 46098
Fortran
53148, 52864, 53111, 53255, 53310
C++
53116, 53193, 53186, 53301
ARM
53187
Debug
53174, 52605
PPC
53199
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7-integration@187598 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
8 files changed, 274 insertions, 42 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0240320620b..f671bc7c5b7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,33 @@ +2012-05-10 DJ Delorie <dj@redhat.com> + + * include/bits/random.tcc (seed_seq::generate): Cast max() + operands to size_t to ensure a template match. + * include/std/bitset (_M_copy_from_ptr): Cast min() operands to + size_t to ensure a template match. + +2012-05-02 Paolo Carlini <paolo.carlini@oracle.com> + + PR libstdc++/53193 + * testsuite/23_containers/unordered_set/instantiation_neg.cc: Adjust + dg-error line number. + +2012-05-01 François Dumont <fdumont@gcc.gnu.org> + + PR libstdc++/53115 + * include/bits/hashtable.h + (_Hashtable<>::_M_rehash_aux(size_type, false_type)): Fix buckets + after insertion of several equivalent elements. + * testsuite/23_containers/unordered_multiset/insert/53115.cc: New. + * testsuite/23_containers/unordered_multimap/insert/53115.cc: New. + +2012-04-30 Andreas Tobler <andreast@fgznet.ch> + + Backport from mainline + 2012-03-21 Andreas Tobler <andreast@fgznet.ch> + + * testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: + Skip this test on powerpc64-*-freebsd*. + 2012-04-25 Jonathan Wakely <jwakely.gcc@gmail.com> * include/std/scoped_allocator (scoped_allocator::__outermost): Do diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index 41418a8a509..2dfed94fdc5 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -1,6 +1,7 @@ // hashtable.h header -*- C++ -*- -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 +// 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 @@ -1670,36 +1671,47 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION while (__p) { - bool __check_now = true; _Node* __next = __p->_M_next(); std::size_t __bkt = _HCBase::_M_bucket_index(__p, __n); - if (!__new_buckets[__bkt]) + if (__prev_p && __prev_bkt == __bkt) { - __p->_M_nxt = _M_before_begin._M_nxt; - _M_before_begin._M_nxt = __p; - __new_buckets[__bkt] = &_M_before_begin; - if (__p->_M_nxt) - __new_buckets[__bbegin_bkt] = __p; - __bbegin_bkt = __bkt; + // Previous insert was already in this bucket, we insert after + // the previously inserted one to preserve equivalent elements + // relative order. + __p->_M_nxt = __prev_p->_M_nxt; + __prev_p->_M_nxt = __p; + + // Inserting after a node in a bucket require to check that we + // haven't change the bucket last node, in this case next + // bucket containing its before begin node must be updated. We + // schedule a check as soon as we move out of the sequence of + // equivalent nodes to limit the number of checks. + __check_bucket = true; } else { - if (__prev_p && __prev_bkt == __bkt) + if (__check_bucket) { - // Previous insert was already in this bucket, we insert after - // the previously inserted one to preserve equivalent elements - // relative order. - __p->_M_nxt = __prev_p->_M_nxt; - __prev_p->_M_nxt = __p; - - // Inserting after a node in a bucket require to check that we - // haven't change the bucket last node, in this case next - // bucket containing its before begin node must be updated. We - // schedule a check as soon as we move out of the sequence of - // equivalent nodes to limit the number of checks. - __check_bucket = true; - __check_now = false; + // Check if we shall update the next bucket because of insertions + // into __prev_bkt bucket. + if (__prev_p->_M_nxt) + { + std::size_t __next_bkt + = _HCBase::_M_bucket_index(__prev_p->_M_next(), __n); + if (__next_bkt != __prev_bkt) + __new_buckets[__next_bkt] = __prev_p; + } + __check_bucket = false; + } + if (!__new_buckets[__bkt]) + { + __p->_M_nxt = _M_before_begin._M_nxt; + _M_before_begin._M_nxt = __p; + __new_buckets[__bkt] = &_M_before_begin; + if (__p->_M_nxt) + __new_buckets[__bbegin_bkt] = __p; + __bbegin_bkt = __bkt; } else { @@ -1707,20 +1719,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __new_buckets[__bkt]->_M_nxt = __p; } } - - if (__check_now && __check_bucket) - { - // Check if we shall update the next bucket because of insertions - // into __prev_bkt bucket. - if (__prev_p->_M_nxt) - { - std::size_t __next_bkt - = _HCBase::_M_bucket_index(__prev_p->_M_next(), __n); - if (__next_bkt != __prev_bkt) - __new_buckets[__next_bkt] = __prev_p; - } - __check_bucket = false; - } + __prev_p = __p; __prev_bkt = __bkt; __p = __next; diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc index 5da353f8bd4..5b90e5a6157 100644 --- a/libstdc++-v3/include/bits/random.tcc +++ b/libstdc++-v3/include/bits/random.tcc @@ -2789,7 +2789,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : (__n - 1) / 2; const size_t __p = (__n - __t) / 2; const size_t __q = __p + __t; - const size_t __m = std::max(__s + 1, __n); + const size_t __m = std::max(size_t(__s + 1), __n); for (size_t __k = 0; __k < __m; ++__k) { diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset index 792a05ace15..7f3cb4dec85 100644 --- a/libstdc++-v3/include/std/bitset +++ b/libstdc++-v3/include/std/bitset @@ -1377,7 +1377,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER size_t __pos, size_t __n, _CharT __zero, _CharT __one) { reset(); - const size_t __nbits = std::min(_Nb, std::min(__n, __len - __pos)); + const size_t __nbits = std::min(_Nb, std::min(__n, size_t(__len - __pos))); for (size_t __i = __nbits; __i > 0; --__i) { const _CharT __c = __s[__pos + __nbits - __i]; diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/insert/53115.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/insert/53115.cc new file mode 100644 index 00000000000..4eb5d426197 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/insert/53115.cc @@ -0,0 +1,101 @@ +// { dg-options "-std=gnu++11" } +// +// Copyright (C) 2012 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 <unordered_map> +#include <testsuite_hooks.h> + +namespace +{ + std::size_t + get_nb_bucket_elems(const std::unordered_multimap<int, int>& us) + { + std::size_t nb = 0; + for (std::size_t b = 0; b != us.bucket_count(); ++b) + nb += us.bucket_size(b); + return nb; + } +} + +void test01() +{ + using namespace std; + bool test __attribute__((unused)) = true; + + std::unordered_multimap<int, int> umm; + umm.insert(make_pair(10, 1)); + VERIFY( umm.size() == 1 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(10, 2)); + VERIFY( umm.size() == 2 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(10, 3)); + VERIFY( umm.size() == 3 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(10, 4)); + VERIFY( umm.size() == 4 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(10, 5)); + VERIFY( umm.size() == 5 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(24, 6)); + VERIFY( umm.size() == 6 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(25, 7)); + VERIFY( umm.size() == 7 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(2, 8)); + VERIFY( umm.size() == 8 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(2, 9)); + VERIFY( umm.size() == 9 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(1, 10)); + VERIFY( umm.size() == 10 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); + + umm.insert(make_pair(10, 11)); + VERIFY( umm.size() == 11 ); + VERIFY( std::distance(umm.begin(), umm.end()) == umm.size() ); + VERIFY( get_nb_bucket_elems(umm) == umm.size() ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/insert/53115.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/insert/53115.cc new file mode 100644 index 00000000000..a23eacb753f --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/insert/53115.cc @@ -0,0 +1,101 @@ +// { dg-options "-std=gnu++11" } +// +// Copyright (C) 2012 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 <unordered_set> +#include <testsuite_hooks.h> + +namespace +{ + std::size_t + get_nb_bucket_elems(const std::unordered_multiset<int>& us) + { + std::size_t nb = 0; + for (std::size_t b = 0; b != us.bucket_count(); ++b) + nb += us.bucket_size(b); + return nb; + } +} + +void test01() +{ + using namespace std; + bool test __attribute__((unused)) = true; + + std::unordered_multiset<int> mms; + mms.insert(10); + VERIFY( mms.size() == 1 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(10); + VERIFY( mms.size() == 2 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(10); + VERIFY( mms.size() == 3 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(10); + VERIFY( mms.size() == 4 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(10); + VERIFY( mms.size() == 5 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(24); + VERIFY( mms.size() == 6 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(25); + VERIFY( mms.size() == 7 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(2); + VERIFY( mms.size() == 8 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(2); + VERIFY( mms.size() == 9 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(1); + VERIFY( mms.size() == 10 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); + + mms.insert(10); + VERIFY( mms.size() == 11 ); + VERIFY( std::distance(mms.begin(), mms.end()) == mms.size() ); + VERIFY( get_nb_bucket_elems(mms) == mms.size() ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc index eb16e81a4d3..b8957c31813 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc @@ -2,7 +2,7 @@ // { dg-options "-std=gnu++0x" } // { dg-require-normal-mode "" } -// Copyright (C) 2011 Free Software Foundation, Inc. +// Copyright (C) 2011, 2012 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 @@ -19,7 +19,7 @@ // with this library; see the file COPYING3. If not see // <http://www.gnu.org/licenses/>. -// { dg-error "static assertion failed" "" { target *-*-* } 185 } +// { dg-error "static assertion failed" "" { target *-*-* } 186 } #include <unordered_set> diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc index 52f8ddf0f44..fc591997318 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. +// Copyright (C) 2007, 2009, 2010, 2012 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 @@ -17,6 +17,7 @@ // 23.2.5 class vector<bool> [lib.vector.bool] +// { dg-skip-if "" { powerpc64-*-freebsd* } { "*" } { "" } } // { dg-do run { xfail *-*-darwin8.[0-4].* } } #include <vector> |