From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id 755E8386F42F for ; Tue, 1 Dec 2020 21:37:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 755E8386F42F Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-209-YwngBAUEOOm6ewRyhC-CgA-1; Tue, 01 Dec 2020 16:37:14 -0500 X-MC-Unique: YwngBAUEOOm6ewRyhC-CgA-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4C3931842156; Tue, 1 Dec 2020 21:37:13 +0000 (UTC) Received: from localhost (unknown [10.33.37.15]) by smtp.corp.redhat.com (Postfix) with ESMTP id DF15E5D9DC; Tue, 1 Dec 2020 21:37:12 +0000 (UTC) Date: Tue, 1 Dec 2020 21:37:11 +0000 From: Jonathan Wakely To: Michael Weghorn 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 Message-ID: <20201201213711.GM2309743@redhat.com> References: <05a6a137-cd44-df8f-01b3-d9f225177ffe@posteo.de> <20200922100439.GV6061@redhat.com> <263513ae-3020-10e4-8b09-6c889c0f3ff3@posteo.de> <20201127163349.GA2309743@redhat.com> MIME-Version: 1.0 In-Reply-To: <20201127163349.GA2309743@redhat.com> X-Clacks-Overhead: GNU Terry Pratchett X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="orO6xySwJI16pVnm" Content-Disposition: inline X-Spam-Status: No, score=-14.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, 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: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Dec 2020 21:37:21 -0000 --orO6xySwJI16pVnm Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit 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, 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. >>>> >>>>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? >>> >> --orO6xySwJI16pVnm Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="patch.txt" commit 39836f8324d819459cb21198e95b993588c6a2b1 Author: Michael Weghorn 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'. '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. 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'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..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 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.begin(); +// { 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); 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); --orO6xySwJI16pVnm--