Hi,
the attached patch implements pretty printers relevant for iteration
over std::vector, thus handling the TODO
added in commit 36d0dada6773d7fd7c5ace64c90e723930a3b81e
("Have std::vector printer's iterator return bool for vector",
2019-06-19):
TODO add printer for vector's _Bit_iterator and
_Bit_const_iterator
Tested on x86_64-pc-linux-gnu (Debian testing).
I haven't filed any copyright assignment for GCC yet, but I'm happy to
do so when pointed to the right place.
Best regards,
Michael
>From a279887aa80971acc2e92157550138eff6c2a4c8 Mon Sep 17 00:00:00 2001
From: Michael Weghorn
Date: Mon, 14 Sep 2020 15:20:36 +0200
Subject: [PATCH] libstdc++: Pretty printers for std::_Bit_reference,
std::_Bit_iterator
... and 'std::_Bit_const_iterator'.
'std::_Bit_iterator' and 'std::_Bit_const_iterator' are the iterators
used by 'std::vector'.
'std::_Bit_reference' is e.g. used in range-based for loops over
'std::vector' like
std::vector vb {true, false, false};
for (auto b : vb) {
// b is of type std::_Bit_reference here
// ...
}
Like iterators of vectors for other types, the actual value is printed.
Add corresponding tests to the testsuite.
libstdc++-v3/ChangeLog:
* python/libstdcxx/v6/printers.py (StdBitIteratorPrinter,
StdBitReferencePrinter): Add pretty-printers for
std::_Bit_reference, std::_Bit_iterator and std::_Bit_const_iterator.
* testsuite/libstdc++-prettyprinters/simple.cc: Test
std::_Bit_reference, std::_Bit_iterator
* testsuite/libstdc++-prettyprinters/simple11.cc: Test
std::_Bit_reference, std::_Bit_iterator and std::_Bit_const_iterator
---
libstdc++-v3/python/libstdcxx/v6/printers.py | 28 -
.../libstdc++-prettyprinters/simple.cc| 28 +
.../libstdc++-prettyprinters/simple11.cc | 31 +++
3 files changed, 86 insertions(+), 1 deletion(-)
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index c0f061f79c1..478e44eefdf 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -479,7 +479,27 @@ class StdVectorIteratorPrinter:
return 'non-dereferenceable iterator for std::vector'
return str(self.val['_M_current'].dereference())
-# TODO add printer for vector's _Bit_iterator and _Bit_const_iterator
+class StdBitIteratorPrinter:
+"Print std::vector's _Bit_iterator and _Bit_const_iterator"
+
+def __init__(self, typename, val):
+self.val = val
+
+def to_string(self):
+if not self.val['_M_p']:
+return 'non-dereferenceable iterator for std::vector'
+return bool(self.val['_M_p'].dereference() & (1 << self.val['_M_offset']))
+
+class StdBitReferencePrinter:
+"Print std::_Bit_reference"
+
+def __init__(self, typename, val):
+self.val = val
+
+def to_string(self):
+if not self.val['_M_p']:
+return 'invalid std::_Bit_reference'
+return bool(self.val['_M_p'].dereference() & (self.val['_M_mask']))
class StdTuplePrinter:
"Print a std::tuple"
@@ -1965,6 +1985,12 @@ def build_libstdcxx_dictionary ():
StdDequeIteratorPrinter)
libstdcxx_printer.add_version('__gnu_cxx::', '__normal_iterator',
StdVectorIteratorPrinter)
+libstdcxx_printer.add_version('std::', '_Bit_iterator',
+ StdBitIteratorPrinter)
+libstdcxx_printer.add_version('std::', '_Bit_const_iterator',
+ StdBitIteratorPrinter)
+libstdcxx_printer.add_version('std::', '_Bit_reference',
+ StdBitReferencePrinter)
libstdcxx_printer.add_version('__gnu_cxx::', '_Slist_iterator',
StdSlistIteratorPrinter)
libstdcxx_printer.add_container('std::', '_Fwd_list_iterator',
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc
index 4b44be594f5..4cfbb7857d1 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc
@@ -127,6 +127,34 @@ main()
vb.erase(vb.begin());
// { dg-final { regexp-test vb {std::(__debug::)?vector of length 5, capacity 128 = \\{true, true, false, false, true\\}} } }
+ std::vector::iterator vbIt = vb.begin();
+// { dg-final { note-test vbIt {true} } }
+ std::vector::iterator vbIt2 = ++vbIt;
+// { dg-final { note-test vbIt2 {true} } }
+ std::vector::iterator vbIt3 = ++vbIt;
+// { dg-final { note-test vbIt3 {false} } }
+ std::vector::iterator vbIt4 = ++vbIt;
+// { dg-final { note-test vbIt4 {false} } }
+ std::vector::iterator vbIt5 = ++vbIt;
+// { dg-final { note-test vbIt5 {true} } }
+
+ std::vector::iterator vbIt0;
+// { dg-final { note-test vb