This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[Patch] Fix unordered::iterator and const_iterator
- From: Paolo Carlini <pcarlini at suse dot de>
- To: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Cc: Matt Austern <austern at gmail dot com>
- Date: Sun, 02 Oct 2005 20:53:59 +0200
- Subject: [Patch] Fix unordered::iterator and const_iterator
Hi,
today, while working on libstdc++/24061, I noticed that something was
wrong with iterator, const_iterator and the local counterparts: turned
out we had in class hashtable the const* variants typedef-ed as
non-const and, in the iterators, the constructors from the non-const
variants taking instead the const variants! Interestingly, those bugs
almost cancelled out each other besides letting in a lot of illegal code...
I'm pretty sure the below is at least a big improvement, but I'll let
you all (and Matt!) have a look.
Tested x86-linxux.
Paolo.
///////////////////
2005-10-03 Paolo Carlini <pcarlini@suse.de>
* include/tr1/hashtable
(node_iterator::node_iterator(const node_iterator<,true,>&)): Fix to
take a "false" (i.e., is_const == false) node_iterator.
(hashtable_iterator::hashtable_iterator(const hashtable_iterator<,
true,>&)): Likewise for hashtable_iterator.
(hashtable::const_local_iterator): Fix typedef (is_const == true).
(hashtable::const_iterator): Likewise.
* testsuite/tr1/6_containers/unordered/types/map_iterator.cc: New.
* testsuite/tr1/6_containers/unordered/types/multimap_iterator.cc: New.
* testsuite/tr1/6_containers/unordered/types/set_iterator.cc: New.
* testsuite/tr1/6_containers/unordered/types/multiset_iterator.cc: New.
diff -urN libstdc++-v3-orig/include/tr1/hashtable libstdc++-v3/include/tr1/hashtable
--- libstdc++-v3-orig/include/tr1/hashtable 2005-10-02 11:47:09.000000000 +0200
+++ libstdc++-v3/include/tr1/hashtable 2005-10-02 16:34:16.000000000 +0200
@@ -171,7 +171,7 @@
node_iterator(hash_node<Value, cache>* p = 0)
: node_iterator_base<Value, cache>(p) { }
- node_iterator(const node_iterator<Value, true, cache>& x)
+ node_iterator(const node_iterator<Value, false, cache>& x)
: node_iterator_base<Value, cache>(x.m_cur) { }
reference
@@ -266,7 +266,7 @@
hashtable_iterator(hash_node<Value, cache>** b)
: hashtable_iterator_base<Value, cache>(*b, b) { }
- hashtable_iterator(const hashtable_iterator<Value, true, cache>& x)
+ hashtable_iterator(const hashtable_iterator<Value, false, cache>& x)
: hashtable_iterator_base<Value, cache>(x.m_cur_node, x.m_cur_bucket) { }
reference
@@ -890,13 +890,13 @@
typedef Internal::node_iterator<value_type, !mutable_iterators,
cache_hash_code>
local_iterator;
- typedef Internal::node_iterator<value_type, false, cache_hash_code>
+ typedef Internal::node_iterator<value_type, true, cache_hash_code>
const_local_iterator;
typedef Internal::hashtable_iterator<value_type, !mutable_iterators,
cache_hash_code>
iterator;
- typedef Internal::hashtable_iterator<value_type, false, cache_hash_code>
+ typedef Internal::hashtable_iterator<value_type, true, cache_hash_code>
const_iterator;
private:
diff -urN libstdc++-v3-orig/testsuite/tr1/6_containers/unordered/types/map_iterator.cc libstdc++-v3/testsuite/tr1/6_containers/unordered/types/map_iterator.cc
--- libstdc++-v3-orig/testsuite/tr1/6_containers/unordered/types/map_iterator.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/tr1/6_containers/unordered/types/map_iterator.cc 2005-10-02 19:42:57.000000000 +0200
@@ -0,0 +1,49 @@
+// 2005-10-02 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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.
+//
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License. This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// { dg-do compile }
+
+#include <tr1/unordered_map>
+
+void test01()
+{
+ typedef std::tr1::unordered_map<int, int> Map;
+
+ Map m;
+
+ Map::const_iterator cit = m.begin();
+ (*cit).second = 0; // { dg-error "read-only" }
+
+ Map::const_local_iterator clit = m.begin(0);
+ (*clit).second = 0; // { dg-error "read-only" }
+
+ Map::iterator it = cit; // { dg-error "conversion" }
+
+ Map::local_iterator lit = clit; // { dg-error "conversion" }
+}
diff -urN libstdc++-v3-orig/testsuite/tr1/6_containers/unordered/types/multimap_iterator.cc libstdc++-v3/testsuite/tr1/6_containers/unordered/types/multimap_iterator.cc
--- libstdc++-v3-orig/testsuite/tr1/6_containers/unordered/types/multimap_iterator.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/tr1/6_containers/unordered/types/multimap_iterator.cc 2005-10-02 19:43:25.000000000 +0200
@@ -0,0 +1,49 @@
+// 2005-10-02 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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.
+//
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License. This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// { dg-do compile }
+
+#include <tr1/unordered_map>
+
+void test01()
+{
+ typedef std::tr1::unordered_multimap<int, int> Mmap;
+
+ Mmap mm;
+
+ Mmap::const_iterator cit = mm.begin();
+ (*cit).second = 0; // { dg-error "read-only" }
+
+ Mmap::const_local_iterator clit = mm.begin(0);
+ (*clit).second = 0; // { dg-error "read-only" }
+
+ Mmap::iterator it = cit; // { dg-error "conversion" }
+
+ Mmap::local_iterator lit = clit; // { dg-error "conversion" }
+}
diff -urN libstdc++-v3-orig/testsuite/tr1/6_containers/unordered/types/multiset_iterator.cc libstdc++-v3/testsuite/tr1/6_containers/unordered/types/multiset_iterator.cc
--- libstdc++-v3-orig/testsuite/tr1/6_containers/unordered/types/multiset_iterator.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/tr1/6_containers/unordered/types/multiset_iterator.cc 2005-10-02 19:39:20.000000000 +0200
@@ -0,0 +1,45 @@
+// 2005-10-02 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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.
+//
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License. This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// { dg-do compile }
+
+#include <tr1/unordered_set>
+
+void test01()
+{
+ typedef std::tr1::unordered_multiset<int> Mset;
+
+ Mset ms;
+
+ Mset::const_iterator cit = ms.begin();
+ *cit = 0; // { dg-error "read-only" }
+
+ Mset::const_local_iterator clit = ms.begin(0);
+ *clit = 0; // { dg-error "read-only" }
+}
diff -urN libstdc++-v3-orig/testsuite/tr1/6_containers/unordered/types/set_iterator.cc libstdc++-v3/testsuite/tr1/6_containers/unordered/types/set_iterator.cc
--- libstdc++-v3-orig/testsuite/tr1/6_containers/unordered/types/set_iterator.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/tr1/6_containers/unordered/types/set_iterator.cc 2005-10-02 19:39:34.000000000 +0200
@@ -0,0 +1,45 @@
+// 2005-10-02 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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.
+//
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License. This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// { dg-do compile }
+
+#include <tr1/unordered_set>
+
+void test01()
+{
+ typedef std::tr1::unordered_set<int> Set;
+
+ Set s;
+
+ Set::const_iterator cit = s.begin();
+ *cit = 0; // { dg-error "read-only" }
+
+ Set::const_local_iterator clit = s.begin(0);
+ *clit = 0; // { dg-error "read-only" }
+}