From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by sourceware.org (Postfix) with ESMTPS id 41ED43858D1E; Mon, 4 Apr 2022 11:39:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 41ED43858D1E Received: by mail-wm1-x330.google.com with SMTP id c190-20020a1c35c7000000b0038e37907b5bso7571724wma.0; Mon, 04 Apr 2022 04:39:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Iz93vo+NxdkPR8HH4q8b5WdCn6LDSaQAIbP9DxM+XwE=; b=DqosvqilQwAKAqISf+4XSJzPzB7ItJUlYkt0VF4jYnqJ63nAta7jPDwgRe1NVZObLN P5ISvgsQl/J0B5+IyeF1d2XV49s3SGhU0e/nQQE0aZEiNh+tX0zwKJOOCyUobVzRs3Es RVY5dpLm7SV+U+LGrLW2F0VwiCqcHTSVGSdmRWaQkE2uNuCZdAJitopJWCNY+8URCqWU wt+t9fnPwQBrrNdxvvDI9u2OQVEu7xYFRYXlPXXo/zpWIoRXYrAEFNRpEdqAItLxx5YY 63iz+6xZm8WXwJ7+GCbyK1LxteT7sLSJpernr5ednds0+dmF57In5d4y2eP4laBZprxL 7P+g== X-Gm-Message-State: AOAM531KivRvhE3DQCn0dSoHzDlyFDZizJ+ESOc2sx07TpoOHV9y9kN3 A/cFJl8Q3j0NagEZ0NoD0jkSdgFrZNwrKm9L+OA= X-Google-Smtp-Source: ABdhPJyc9SkRKzKrCgATr8dPpZGZ55gXJdOl3tF95SqpnsDqLMaqg7MryBRuKFMqAmXSXJ1yTHi7cxvIfj6rffSDroE= X-Received: by 2002:a7b:c041:0:b0:38c:7c21:8ade with SMTP id u1-20020a7bc041000000b0038c7c218ademr18877177wmc.163.1649072389954; Mon, 04 Apr 2022 04:39:49 -0700 (PDT) MIME-Version: 1.0 References: <20220404105257.199452-1-fent@in.tum.de> In-Reply-To: <20220404105257.199452-1-fent@in.tum.de> From: Jonathan Wakely Date: Mon, 4 Apr 2022 12:39:38 +0100 Message-ID: Subject: Re: [PATCH] libstdc++: Add pretty printer for std::span To: Philipp Fent Cc: "libstdc++" , gcc-patches Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Mon, 04 Apr 2022 11:39:53 -0000 On Mon, 4 Apr 2022 at 11:54, Philipp Fent via Libstdc++ wrote: > > This improves the debug output for C++20 spans. > Before: > {static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8, > _M_extent = {_M_extent_value = 2}} > Now with StdSpanPrinter: > std::span of length 2 = {1, 2} Nice, thanks. I'll get this committed in time for GCC 12 (and backport it to release branches too). > --- > libstdc++-v3/python/libstdcxx/v6/printers.py | 38 +++++++++++++++++++ > .../libstdc++-prettyprinters/cxx20.cc | 11 ++++++ > 2 files changed, 49 insertions(+) > > diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py > index f7a7f9961..6d8b765f2 100644 > --- a/libstdc++-v3/python/libstdcxx/v6/printers.py > +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py > @@ -1654,6 +1654,43 @@ class StdRegexStatePrinter: > s = "{}, {}={}".format(s, v, self.val['_M_' + v]) > return "{%s}" % (s) > > +class StdSpanPrinter: > + "Print a std::span" > + > + class _iterator(Iterator): > + def __init__(self, begin, size): > + self.count = 0 > + self.begin = begin > + self.size = size > + > + def __iter__ (self): > + return self > + > + def __next__ (self): > + if self.count == self.size: > + raise StopIteration > + > + count = self.count > + self.count = self.count + 1 > + return '[%d]' % count, (self.begin + count).dereference() > + > + def __init__(self, typename, val): > + self.typename = typename > + self.val = val > + if val.type.template_argument(1) == gdb.parse_and_eval('static_cast(-1)'): > + self.size = val['_M_extent']['_M_extent_value'] > + else: > + self.size = val.type.template_argument(1) > + > + def to_string(self): > + return '%s of length %d' % (self.typename, self.size) > + > + def children(self): > + return self._iterator(self.val['_M_ptr'], self.size) > + > + def display_hint(self): > + return 'array' > + > # A "regular expression" printer which conforms to the > # "SubPrettyPrinter" protocol from gdb.printing. > class RxPrinter(object): > @@ -2170,6 +2207,7 @@ def build_libstdcxx_dictionary (): > libstdcxx_printer.add_version('std::', 'partial_ordering', StdCmpCatPrinter) > libstdcxx_printer.add_version('std::', 'weak_ordering', StdCmpCatPrinter) > libstdcxx_printer.add_version('std::', 'strong_ordering', StdCmpCatPrinter) > + libstdcxx_printer.add_version('std::', 'span', StdSpanPrinter) > > # Extensions. > libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter) > diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc > index b0de25c27..76023df93 100644 > --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc > +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc > @@ -18,8 +18,10 @@ > // with this library; see the file COPYING3. If not see > // . > > +#include > #include > #include > +#include > > struct X > { > @@ -54,6 +56,15 @@ main() > auto c10 = 0.0 <=> __builtin_nan(""); > // { dg-final { note-test c10 "std::partial_ordering::unordered" } } > > + auto il = {1, 2}; > + auto s1 = std::span(il); > + static_assert(s1.extent == std::size_t(-1)); > +// { dg-final { note-test s1 {std::span of length 2 = {1, 2}} } } > + auto a = std::array{3, 4}; > + auto s2 = std::span(a); > + static_assert(s2.extent == std::size_t(2)); > +// { dg-final { note-test s2 {std::span of length 2 = {3, 4}} } } > + > std::cout << "\n"; > return 0; // Mark SPOT > } > -- > 2.35.1 >