printers.py (NodeIteratorPrinter): New.
authorFrançois Dumont <fdumont@gcc.gnu.org>
Thu, 8 Mar 2018 06:26:15 +0000 (06:26 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Thu, 8 Mar 2018 06:26:15 +0000 (06:26 +0000)
2018-03-08  François Dumont  <fdumont@gcc.gnu.org>

* 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

libstdc++-v3/ChangeLog
libstdc++-v3/python/libstdcxx/v6/printers.py
libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc
libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc

index b0b3a95..69c6ec6 100644 (file)
@@ -1,3 +1,16 @@
+2018-03-08  François Dumont  <fdumont@gcc.gnu.org>
+
+       * 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  <ville.voutilainen@gmail.com>
 
        PR libstdc++/84601
index c490880..b5f76f2 100644 (file)
@@ -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 ()
index 72b2eeb..9f7f763 100644 (file)
@@ -19,7 +19,9 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-#define _GLIBCXX_DEBUG
+#ifndef _GLIBCXX_DEBUG
+# define _GLIBCXX_DEBUG
+#endif
 
 #include <string>
 #include <deque>
@@ -96,7 +98,7 @@ main()
   v.push_back(1);
   v.push_back(2);
   std::vector<int>::iterator viter0;
-// { dg-final { note-test viter0 {invalid iterator} } }
+// { dg-final { note-test viter0 {non-dereferenceable iterator for std::vector} } }
   std::vector<int>::iterator viter1 = v.begin();
   std::vector<int>::iterator viter2 = viter1 + 1;
   v.erase(viter1);
index 5d98350..1990084 100644 (file)
@@ -19,7 +19,9 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-#define _GLIBCXX_DEBUG
+#ifndef _GLIBCXX_DEBUG
+# define _GLIBCXX_DEBUG
+#endif
 
 #include <forward_list>
 #include <unordered_map>
@@ -31,7 +33,7 @@ main()
 {
   std::forward_list<std::string> flst;
   std::forward_list<std::string>::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<std::string>::iterator flstiter1 = flst.begin();
 // { dg-final { note-test *flstiter1 {"dum"}} }