From: Jonathan Wakely <jwakely@redhat.com>
To: Michael Weghorn <m.weghorn@posteo.de>
Cc: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: Re: [PING] [PATCH] libstdc++: Pretty printers for std::_Bit_reference, std::_Bit_iterator and std::_Bit_const_iterator
Date: Tue, 1 Dec 2020 21:37:11 +0000 [thread overview]
Message-ID: <20201201213711.GM2309743@redhat.com> (raw)
In-Reply-To: <20201127163349.GA2309743@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 1522 bytes --]
On 27/11/20 16:33 +0000, Jonathan Wakely wrote:
>On 25/11/20 15:05 +0100, Michael Weghorn via Libstdc++ wrote:
>>I'd like to ping for this patch:
>>https://gcc.gnu.org/pipermail/gcc-patches/2020-September/553870.html
>
>Thanks, I'll take another look next week.
I've applied the patch now, thanks.
I adjusted it slightly, to add a test for const_iterator to the C++98
test, simple.cc, consistent with the C++11 one, simple11.cc
Tested powerpc64le-linux, committed to trunk.
Thanks again for the patch, and your patience.
>>Michael
>>
>>On 11/10/2020 19.22, Michael Weghorn via Gcc-patches wrote:
>>>On 22/09/2020 12.04, Jonathan Wakely wrote:
>>>>On 14/09/20 16:49 +0200, Michael Weghorn via Libstdc++ wrote:
>>>>>Hi,
>>>>>
>>>>>the attached patch implements pretty printers relevant for iteration
>>>>>over std::vector<bool>, thus handling the TODO
>>>>>added in commit 36d0dada6773d7fd7c5ace64c90e723930a3b81e
>>>>>("Have std::vector printer's iterator return bool for vector<bool>",
>>>>>2019-06-19):
>>>>>
>>>>>Â Â TODO add printer for vector<bool>'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.
>>>>
>>>>Thanks for the patch! I'll send you the form to start the copyuright
>>>>assignment process.
>>>>
>>>>
>>>
>>>Thanks! The copyright assignment is done now. Is there anything else to
>>>do from my side at the moment?
>>>
>>
[-- Attachment #2: patch.txt --]
[-- Type: text/x-patch, Size: 6756 bytes --]
commit 39836f8324d819459cb21198e95b993588c6a2b1
Author: Michael Weghorn <m.weghorn@posteo.de>
Date: Tue Dec 1 21:19:20 2020
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.
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<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 4b44be594f5..9821d1805cf 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 0ebd80a42e9..519565693b7 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);
next prev parent reply other threads:[~2020-12-01 21:37 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-14 14:49 Michael Weghorn
2020-09-22 10:04 ` Jonathan Wakely
2020-10-11 17:22 ` Michael Weghorn
2020-11-25 14:05 ` [PING] " Michael Weghorn
2020-11-27 16:33 ` Jonathan Wakely
2020-12-01 21:37 ` Jonathan Wakely [this message]
2020-12-02 7:01 ` Michael Weghorn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201201213711.GM2309743@redhat.com \
--to=jwakely@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=libstdc++@gcc.gnu.org \
--cc=m.weghorn@posteo.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).