From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by sourceware.org (Postfix) with ESMTPS id 7AA843870906 for ; Mon, 14 Sep 2020 14:49:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7AA843870906 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 8563C2400FB for ; Mon, 14 Sep 2020 16:49:32 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4Bqq574Vqxz6tmc; Mon, 14 Sep 2020 16:49:31 +0200 (CEST) To: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org From: Michael Weghorn Subject: [PATCH] libstdc++: Pretty printers for std::_Bit_reference, std::_Bit_iterator and std::_Bit_const_iterator Message-ID: <05a6a137-cd44-df8f-01b3-d9f225177ffe@posteo.de> Date: Mon, 14 Sep 2020 16:49:21 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------518246F165EA8B7741A6F93E" Content-Language: en-US X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Sep 2020 14:49:36 -0000 This is a multi-part message in MIME format. --------------518246F165EA8B7741A6F93E Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 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 --------------518246F165EA8B7741A6F93E Content-Type: text/x-patch; charset=UTF-8; name="0001-libstdc-Pretty-printers-for-std-_Bit_reference-std-_.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-libstdc-Pretty-printers-for-std-_Bit_reference-std-_.pa"; filename*1="tch" >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 vbIt0 {non-dereferenceable iterator for std::vector} } } + + 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 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 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::const_iterator vbcIt = vb.cbegin(); +// { dg-final { note-test vbcIt {true} } } + + std::vector::iterator vbIt0; +// { dg-final { note-test vbIt0 {non-dereferenceable iterator for std::vector} } } + + 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 sll; sll.push_front(23); sll.push_front(47); -- 2.28.0 --------------518246F165EA8B7741A6F93E--