diff options
author | Michael Weghorn <m.weghorn@posteo.de> | 2020-12-01 21:19:20 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-12-01 21:35:32 +0000 |
commit | 39836f8324d819459cb21198e95b993588c6a2b1 (patch) | |
tree | 09a17861418986fb85ef54d6e737ba047b16bc3c | |
parent | 968666a011b904f70d12e52180d361faaedfd3a2 (diff) | |
download | gcc-39836f8324d819459cb21198e95b993588c6a2b1.zip gcc-39836f8324d819459cb21198e95b993588c6a2b1.tar.gz gcc-39836f8324d819459cb21198e95b993588c6a2b1.tar.bz2 |
libstdc++: Pretty printers for _Bit_reference and _Bit_iterator
'std::_Bit_iterator' and 'std::_Bit_const_iterator' are the iterators
used by 'std::vector<bool>'.
'std::_Bit_reference' is e.g. used in range-based for loops over
'std::vector<bool>' like
std::vector<bool> 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.
libstdc++-v3/ChangeLog:
* python/libstdcxx/v6/printers.py (StdBitIteratorPrinter)
(StdBitReferencePrinter): Add pretty-printers for
_Bit_reference, _Bit_iterator and _Bit_const_iterator.
* testsuite/libstdc++-prettyprinters/simple.cc: Test
std::_Bit_reference, std::_Bit_iterator and
std::_Bit_const_iterator.
* testsuite/libstdc++-prettyprinters/simple11.cc: Likewise.
-rw-r--r-- | libstdc++-v3/python/libstdcxx/v6/printers.py | 28 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc | 31 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc | 31 |
3 files changed, 89 insertions, 1 deletions
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index c0f061f..478e44e 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<bool>'s _Bit_iterator and _Bit_const_iterator +class StdBitIteratorPrinter: + "Print std::vector<bool>'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<bool>' + 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 4b44be5..9821d18 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc @@ -127,6 +127,37 @@ main() vb.erase(vb.begin()); // { dg-final { regexp-test vb {std::(__debug::)?vector<bool> of length 5, capacity 128 = \\{true, true, false, false, true\\}} } } + std::vector<bool>::iterator vbIt = vb.begin(); +// { dg-final { note-test vbIt {true} } } + std::vector<bool>::iterator vbIt2 = ++vbIt; +// { dg-final { note-test vbIt2 {true} } } + std::vector<bool>::iterator vbIt3 = ++vbIt; +// { dg-final { note-test vbIt3 {false} } } + std::vector<bool>::iterator vbIt4 = ++vbIt; +// { dg-final { note-test vbIt4 {false} } } + std::vector<bool>::iterator vbIt5 = ++vbIt; +// { dg-final { note-test vbIt5 {true} } } + + std::vector<bool>::const_iterator vbcIt = vb.begin(); +// { dg-final { note-test vbcIt {true} } } + + std::vector<bool>::iterator vbIt0; +// { dg-final { note-test vbIt0 {non-dereferenceable iterator for std::vector<bool>} } } + + std::_Bit_reference br = *vb.begin(); +// { dg-final { note-test br {true} } } + std::_Bit_reference br2 = *vbIt2; +// { dg-final { note-test br2 {true} } } + std::_Bit_reference br3 = *vbIt3; +// { dg-final { note-test br3 {false} } } + std::_Bit_reference br4 = *vbIt4; +// { dg-final { note-test br4 {false} } } + std::_Bit_reference br5 = *vbIt5; +// { dg-final { note-test br5 {true} } } + + std::_Bit_reference br0; +// { dg-final { note-test br0 {invalid std::_Bit_reference} } } + __gnu_cxx::slist<int> sll; sll.push_front(23); sll.push_front(47); diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc index 0ebd80a..5195656 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc @@ -120,6 +120,37 @@ main() vb.erase(vb.begin()); // { dg-final { regexp-test vb {std::(__debug::)?vector<bool> of length 5, capacity 128 = \\{true, true, false, false, true\\}} } } + std::vector<bool>::iterator vbIt = vb.begin(); +// { dg-final { note-test vbIt {true} } } + std::vector<bool>::iterator vbIt2 = ++vbIt; +// { dg-final { note-test vbIt2 {true} } } + std::vector<bool>::iterator vbIt3 = ++vbIt; +// { dg-final { note-test vbIt3 {false} } } + std::vector<bool>::iterator vbIt4 = ++vbIt; +// { dg-final { note-test vbIt4 {false} } } + std::vector<bool>::iterator vbIt5 = ++vbIt; +// { dg-final { note-test vbIt5 {true} } } + + std::vector<bool>::const_iterator vbcIt = vb.cbegin(); +// { dg-final { note-test vbcIt {true} } } + + std::vector<bool>::iterator vbIt0; +// { dg-final { note-test vbIt0 {non-dereferenceable iterator for std::vector<bool>} } } + + std::_Bit_reference br = *vb.begin(); +// { dg-final { note-test br {true} } } + std::_Bit_reference br2 = *vbIt2; +// { dg-final { note-test br2 {true} } } + std::_Bit_reference br3 = *vbIt3; +// { dg-final { note-test br3 {false} } } + std::_Bit_reference br4 = *vbIt4; +// { dg-final { note-test br4 {false} } } + std::_Bit_reference br5 = *vbIt5; +// { dg-final { note-test br5 {true} } } + + std::_Bit_reference br0; +// { dg-final { note-test br0 {invalid std::_Bit_reference} } } + __gnu_cxx::slist<int> sll; sll.push_front(23); sll.push_front(47); |