mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 05:44:15 +08:00
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.
This commit is contained in:
parent
968666a011
commit
39836f8324
@ -479,7 +479,27 @@ class StdVectorIteratorPrinter:
|
|||||||
return 'non-dereferenceable iterator for std::vector'
|
return 'non-dereferenceable iterator for std::vector'
|
||||||
return str(self.val['_M_current'].dereference())
|
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:
|
class StdTuplePrinter:
|
||||||
"Print a std::tuple"
|
"Print a std::tuple"
|
||||||
@ -1965,6 +1985,12 @@ def build_libstdcxx_dictionary ():
|
|||||||
StdDequeIteratorPrinter)
|
StdDequeIteratorPrinter)
|
||||||
libstdcxx_printer.add_version('__gnu_cxx::', '__normal_iterator',
|
libstdcxx_printer.add_version('__gnu_cxx::', '__normal_iterator',
|
||||||
StdVectorIteratorPrinter)
|
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',
|
libstdcxx_printer.add_version('__gnu_cxx::', '_Slist_iterator',
|
||||||
StdSlistIteratorPrinter)
|
StdSlistIteratorPrinter)
|
||||||
libstdcxx_printer.add_container('std::', '_Fwd_list_iterator',
|
libstdcxx_printer.add_container('std::', '_Fwd_list_iterator',
|
||||||
|
@ -127,6 +127,37 @@ main()
|
|||||||
vb.erase(vb.begin());
|
vb.erase(vb.begin());
|
||||||
// { dg-final { regexp-test vb {std::(__debug::)?vector<bool> of length 5, capacity 128 = \\{true, true, false, false, true\\}} } }
|
// { 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;
|
__gnu_cxx::slist<int> sll;
|
||||||
sll.push_front(23);
|
sll.push_front(23);
|
||||||
sll.push_front(47);
|
sll.push_front(47);
|
||||||
|
@ -120,6 +120,37 @@ main()
|
|||||||
vb.erase(vb.begin());
|
vb.erase(vb.begin());
|
||||||
// { dg-final { regexp-test vb {std::(__debug::)?vector<bool> of length 5, capacity 128 = \\{true, true, false, false, true\\}} } }
|
// { 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;
|
__gnu_cxx::slist<int> sll;
|
||||||
sll.push_front(23);
|
sll.push_front(23);
|
||||||
sll.push_front(47);
|
sll.push_front(47);
|
||||||
|
Loading…
Reference in New Issue
Block a user