mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			re PR libstdc++/59476 (gdb pretty-printer cannot print C++11 _Rb_tree_iterator)
PR libstdc++/59476 * python/libstdcxx/v6/printers.py (get_value_from_Rb_tree_node): New function to handle both C++03 and C++11 _Rb_tree_node implementations. (StdRbtreeIteratorPrinter, StdMapPrinter, StdSetPrinter): Use it. * testsuite/libstdc++-prettyprinters/simple.cc: Update comment to refer to... * testsuite/libstdc++-prettyprinters/simple11.cc: New. From-SVN: r210008
This commit is contained in:
		
							parent
							
								
									e13b3dfdee
								
							
						
					
					
						commit
						047f1cec7f
					
				|  | @ -1,3 +1,13 @@ | |||
| 2014-05-02  Jonathan Wakely  <jwakely@redhat.com> | ||||
| 
 | ||||
| 	PR libstdc++/59476 | ||||
| 	* python/libstdcxx/v6/printers.py (get_value_from_Rb_tree_node): New | ||||
| 	function to handle both C++03 and C++11 _Rb_tree_node implementations. | ||||
| 	(StdRbtreeIteratorPrinter, StdMapPrinter, StdSetPrinter): Use it. | ||||
| 	* testsuite/libstdc++-prettyprinters/simple.cc: Update comment to | ||||
| 	refer to... | ||||
| 	* testsuite/libstdc++-prettyprinters/simple11.cc: New. | ||||
| 
 | ||||
| 2014-04-27  Tim Shen  <timshen91@gmail.com> | ||||
| 
 | ||||
| 	* include/bits/regex_automaton.h (_NFA<>::_M_insert_repeat): | ||||
|  |  | |||
|  | @ -375,6 +375,22 @@ class RbtreeIterator: | |||
|             self.node = node | ||||
|         return result | ||||
| 
 | ||||
| def get_value_from_Rb_tree_node(node): | ||||
|     """Returns the value held in an _Rb_tree_node<_Val>""" | ||||
|     try: | ||||
|         member = node.type.fields()[1].name | ||||
|         if member == '_M_value_field': | ||||
|             # C++03 implementation, node contains the value as a member | ||||
|             return node['_M_value_field'] | ||||
|         elif member == '_M_storage': | ||||
|             # C++11 implementation, node stores value in __aligned_buffer | ||||
|             p = node['_M_storage']['_M_storage'].address | ||||
|             p = p.cast(node.type.template_argument(0).pointer()) | ||||
|             return p.dereference() | ||||
|     except: | ||||
|         pass | ||||
|     raise ValueError, "Unsupported implementation for %s" % str(node.type) | ||||
| 
 | ||||
| # This is a pretty printer for std::_Rb_tree_iterator (which is | ||||
| # std::map::iterator), and has nothing to do with the RbtreeIterator | ||||
| # class above. | ||||
|  | @ -387,7 +403,8 @@ class StdRbtreeIteratorPrinter: | |||
|     def to_string (self): | ||||
|         typename = str(self.val.type.strip_typedefs()) + '::_Link_type' | ||||
|         nodetype = gdb.lookup_type(typename).strip_typedefs() | ||||
|         return self.val.cast(nodetype).dereference()['_M_value_field'] | ||||
|         node = self.val.cast(nodetype).dereference() | ||||
|         return get_value_from_Rb_tree_node(node) | ||||
| 
 | ||||
| class StdDebugIteratorPrinter: | ||||
|     "Print a debug enabled version of an iterator" | ||||
|  | @ -417,7 +434,8 @@ class StdMapPrinter: | |||
|         def next(self): | ||||
|             if self.count % 2 == 0: | ||||
|                 n = self.rbiter.next() | ||||
|                 n = n.cast(self.type).dereference()['_M_value_field'] | ||||
|                 n = n.cast(self.type).dereference() | ||||
|                 n = get_value_from_Rb_tree_node(n) | ||||
|                 self.pair = n | ||||
|                 item = n['first'] | ||||
|             else: | ||||
|  | @ -458,7 +476,8 @@ class StdSetPrinter: | |||
| 
 | ||||
|         def next(self): | ||||
|             item = self.rbiter.next() | ||||
|             item = item.cast(self.type).dereference()['_M_value_field'] | ||||
|             item = item.cast(self.type).dereference() | ||||
|             item = get_value_from_Rb_tree_node(item) | ||||
|             # FIXME: this is weird ... what to do? | ||||
|             # Maybe a 'set' display hint? | ||||
|             result = ('[%d]' % self.count, item) | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| // If you modify this, please update debug.cc as well.
 | ||||
| // If you modify this, please update simple11.cc and debug.cc as well.
 | ||||
| 
 | ||||
| // { dg-do run }
 | ||||
| // { dg-options "-g -O0" }
 | ||||
|  |  | |||
|  | @ -0,0 +1,92 @@ | |||
| // If you modify this, please update simple.cc and debug.cc as well.
 | ||||
| 
 | ||||
| // { dg-do run }
 | ||||
| // { dg-options "-g -O0 -std=gnu++11" }
 | ||||
| 
 | ||||
| // Copyright (C) 2011-2014 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 <string> | ||||
| #include <deque> | ||||
| #include <bitset> | ||||
| #include <iostream> | ||||
| #include <list> | ||||
| #include <map> | ||||
| #include <set> | ||||
| #include <ext/slist> | ||||
| 
 | ||||
| int | ||||
| main() | ||||
| { | ||||
|   std::string tem; | ||||
|   std::string str = "zardoz"; | ||||
| // { dg-final { note-test str "\"zardoz\"" } }
 | ||||
| 
 | ||||
|   std::bitset<10> bs; | ||||
|   bs[0] = 1; | ||||
|   bs[5] = 1; | ||||
|   bs[7] = 1; | ||||
| // { dg-final { note-test bs {std::bitset = {[0] = 1, [5] = 1, [7] = 1}} } }
 | ||||
| 
 | ||||
|   std::deque<std::string> deq; | ||||
|   deq.push_back("one"); | ||||
|   deq.push_back("two"); | ||||
| // { dg-final { note-test deq {std::deque with 2 elements = {"one", "two"}} } }
 | ||||
| 
 | ||||
|   std::deque<std::string>::iterator deqiter = deq.begin(); | ||||
| // { dg-final { note-test deqiter {"one"} } }
 | ||||
| 
 | ||||
|   std::list<std::string> lst; | ||||
|   lst.push_back("one"); | ||||
|   lst.push_back("two"); | ||||
| // { dg-final { note-test lst {std::list = {[0] = "one", [1] = "two"}} } }
 | ||||
| 
 | ||||
|   std::list<std::string>::iterator lstiter = lst.begin(); | ||||
|   tem = *lstiter; | ||||
| // { dg-final { note-test lstiter {"one"}} }
 | ||||
| 
 | ||||
|   std::list<std::string>::const_iterator lstciter = lst.begin(); | ||||
|   tem = *lstciter; | ||||
| // { dg-final { note-test lstciter {"one"}} }
 | ||||
| 
 | ||||
|   std::map<std::string, int> mp; | ||||
|   mp["zardoz"] = 23; | ||||
| // { dg-final { note-test mp {std::map with 1 elements = {["zardoz"] = 23}} } }
 | ||||
| 
 | ||||
|   std::map<std::string, int>::iterator mpiter = mp.begin(); | ||||
| // { dg-final { note-test mpiter {{first = "zardoz", second = 23}} } }
 | ||||
| 
 | ||||
|   std::set<std::string> sp; | ||||
|   sp.insert("clownfish"); | ||||
|   sp.insert("barrel"); | ||||
| // { dg-final { note-test sp {std::set with 2 elements = {[0] = "barrel", [1] = "clownfish"}} } }
 | ||||
| 
 | ||||
|   std::set<std::string>::const_iterator spciter = sp.begin(); | ||||
| // { dg-final { note-test spciter {"barrel"} } }
 | ||||
| 
 | ||||
|   __gnu_cxx::slist<int> sll; | ||||
|   sll.push_front(23); | ||||
|   sll.push_front(47); | ||||
| // { dg-final { note-test sll {__gnu_cxx::slist = {[0] = 47, [1] = 23}} } }
 | ||||
| 
 | ||||
|   __gnu_cxx::slist<int>::iterator slliter = sll.begin(); | ||||
| // { dg-final { note-test slliter {47} } }
 | ||||
| 
 | ||||
|   return 0;			// Mark SPOT
 | ||||
| } | ||||
| 
 | ||||
| // { dg-final { gdb-test SPOT } }
 | ||||
		Loading…
	
		Reference in New Issue
	
	 Jonathan Wakely
						Jonathan Wakely