From: François Dumont Date: Thu, 8 Mar 2018 06:26:15 +0000 (+0000) Subject: printers.py (NodeIteratorPrinter): New. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fe6bd21a0bda55abf859223648f31710772eb1eb;p=gcc.git printers.py (NodeIteratorPrinter): New. 2018-03-08 François Dumont * python/libstdcxx/v6/printers.py (NodeIteratorPrinter): New. (StdListIteratorPrinter): Inherit from latter. (StdFwdListIteratorPrinter): New, inherit from latter. (StdDebugIteratorPrinter.to_string): Use non-debug iterator printer when iterator has no associated container. (build_libstdcxx_dictionary): Add __gnu_cxx::_Fwd_list_iterator and __gnu_cxx::_Fwd_list_const_iterator printers. Remove __norm namespace registrations. * testsuite/libstdc++-prettyprinters/debug.cc: Adapt. * testsuite/libstdc++-prettyprinters/debug_cxx11.cc: Adapt. From-SVN: r258350 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b0b3a956ace..69c6ec6d29d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2018-03-08 François Dumont + + * python/libstdcxx/v6/printers.py (NodeIteratorPrinter): New. + (StdListIteratorPrinter): Inherit from latter. + (StdFwdListIteratorPrinter): New, inherit from latter. + (StdDebugIteratorPrinter.to_string): Use non-debug iterator printer + when iterator has no associated container. + (build_libstdcxx_dictionary): Add __gnu_cxx::_Fwd_list_iterator and + __gnu_cxx::_Fwd_list_const_iterator printers. Remove __norm namespace + registrations. + * testsuite/libstdc++-prettyprinters/debug.cc: Adapt. + * testsuite/libstdc++-prettyprinters/debug_cxx11.cc: Adapt. + 2018-03-06 Ville Voutilainen PR libstdc++/84601 diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index c490880cd10..b5f76f20810 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -249,21 +249,32 @@ class StdListPrinter: return 'empty %s' % (self.typename) return '%s' % (self.typename) -class StdListIteratorPrinter: - "Print std::list::iterator" - - def __init__(self, typename, val): +class NodeIteratorPrinter: + def __init__(self, typename, val, contname): self.val = val self.typename = typename + self.contname = contname def to_string(self): if not self.val['_M_node']: - return 'non-dereferenceable iterator for std::list' + return 'non-dereferenceable iterator for std::%s' % (self.contname) nodetype = find_type(self.val.type, '_Node') nodetype = nodetype.strip_typedefs().pointer() node = self.val['_M_node'].cast(nodetype).dereference() return str(get_value_from_list_node(node)) +class StdListIteratorPrinter(NodeIteratorPrinter): + "Print std::list::iterator" + + def __init__(self, typename, val): + NodeIteratorPrinter.__init__(self, typename, val, 'list') + +class StdFwdListIteratorPrinter(NodeIteratorPrinter): + "Print std::forward_list::iterator" + + def __init__(self, typename, val): + NodeIteratorPrinter.__init__(self, typename, val, 'forward_list') + class StdSlistPrinter: "Print a __gnu_cxx::slist" @@ -575,10 +586,12 @@ class StdDebugIteratorPrinter: # and return the wrapped iterator value. def to_string (self): base_type = gdb.lookup_type('__gnu_debug::_Safe_iterator_base') + itype = self.val.type.template_argument(0) safe_seq = self.val.cast(base_type)['_M_sequence'] - if not safe_seq or self.val['_M_version'] != safe_seq['_M_version']: + if not safe_seq: + return str(self.val.cast(itype)) + if self.val['_M_version'] != safe_seq['_M_version']: return "invalid iterator" - itype = self.val.type.template_argument(0) return str(self.val.cast(itype)) def num_elements(num): @@ -1731,21 +1744,14 @@ def build_libstdcxx_dictionary (): StdVectorIteratorPrinter) libstdcxx_printer.add_version('__gnu_cxx::', '_Slist_iterator', StdSlistIteratorPrinter) + libstdcxx_printer.add_version('__gnu_cxx::', '_Fwd_list_iterator', + StdFwdListIteratorPrinter) + libstdcxx_printer.add_version('__gnu_cxx::', '_Fwd_list_const_iterator', + StdFwdListIteratorPrinter) # Debug (compiled with -D_GLIBCXX_DEBUG) printer - # registrations. The Rb_tree debug iterator when unwrapped - # from the encapsulating __gnu_debug::_Safe_iterator does not - # have the __norm namespace. Just use the existing printer - # registration for that. + # registrations. libstdcxx_printer.add('__gnu_debug::_Safe_iterator', StdDebugIteratorPrinter) - libstdcxx_printer.add('std::__norm::_List_iterator', - StdListIteratorPrinter) - libstdcxx_printer.add('std::__norm::_List_const_iterator', - StdListIteratorPrinter) - libstdcxx_printer.add('std::__norm::_Deque_const_iterator', - StdDequeIteratorPrinter) - libstdcxx_printer.add('std::__norm::_Deque_iterator', - StdDequeIteratorPrinter) build_libstdcxx_dictionary () diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc index 72b2eeb29b2..9f7f7631219 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc @@ -19,7 +19,9 @@ // with this library; see the file COPYING3. If not see // . -#define _GLIBCXX_DEBUG +#ifndef _GLIBCXX_DEBUG +# define _GLIBCXX_DEBUG +#endif #include #include @@ -96,7 +98,7 @@ main() v.push_back(1); v.push_back(2); std::vector::iterator viter0; -// { dg-final { note-test viter0 {invalid iterator} } } +// { dg-final { note-test viter0 {non-dereferenceable iterator for std::vector} } } std::vector::iterator viter1 = v.begin(); std::vector::iterator viter2 = viter1 + 1; v.erase(viter1); diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc index 5d9835099e7..1990084e3e5 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc @@ -19,7 +19,9 @@ // with this library; see the file COPYING3. If not see // . -#define _GLIBCXX_DEBUG +#ifndef _GLIBCXX_DEBUG +# define _GLIBCXX_DEBUG +#endif #include #include @@ -31,7 +33,7 @@ main() { std::forward_list flst; std::forward_list::iterator flstiter0; -// { dg-final { note-test flstiter0 {invalid iterator}} } +// { dg-final { note-test flstiter0 {non-dereferenceable iterator for std::forward_list}} } flst.push_front("dum"); std::forward_list::iterator flstiter1 = flst.begin(); // { dg-final { note-test *flstiter1 {"dum"}} }