This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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" }
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]