aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2012-05-16 15:29:56 +0000
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2012-05-16 15:29:56 +0000
commitb8f311f40347abb6621e45f8a3ae6ac20d923ed0 (patch)
treec320e7e8a356f020231ccc70c995f00aec70b058 /libstdc++-v3
parent90eefc2611833548e7275ed6d174f76d7d23e875 (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')
-rw-r--r--libstdc++-v3/ChangeLog30
-rw-r--r--libstdc++-v3/include/bits/hashtable.h73
-rw-r--r--libstdc++-v3/include/bits/random.tcc2
-rw-r--r--libstdc++-v3/include/std/bitset2
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_multimap/insert/53115.cc101
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_multiset/insert/53115.cc101
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc3
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>