From: Jonathan Wakely <jwakely.gcc@gmail.com>
To: Philipp Fent <fent@in.tum.de>
Cc: "libstdc++" <libstdc++@gcc.gnu.org>,
gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] libstdc++: Add pretty printer for std::span
Date: Mon, 4 Apr 2022 12:39:38 +0100 [thread overview]
Message-ID: <CAH6eHdT2YU1e--Prx5jZv3zRUcuQJGu3wVr+5Z2fMOK99EodzA@mail.gmail.com> (raw)
In-Reply-To: <20220404105257.199452-1-fent@in.tum.de>
On Mon, 4 Apr 2022 at 11:54, Philipp Fent via Libstdc++
<libstdc++@gcc.gnu.org> 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<std::size_t>(-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
> // <http://www.gnu.org/licenses/>.
>
> +#include <array>
> #include <compare>
> #include <iostream>
> +#include <span>
>
> 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
>
next prev parent reply other threads:[~2022-04-04 11:39 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-04 10:52 Philipp Fent
2022-04-04 11:39 ` Jonathan Wakely [this message]
2022-04-19 9:34 ` Philipp Fent
2022-04-19 10:28 ` Jonathan Wakely
2022-04-19 11:32 ` Philipp Fent
2022-04-19 11:36 ` Jonathan Wakely
2022-04-14 15:49 ` Jonathan Wakely
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=CAH6eHdT2YU1e--Prx5jZv3zRUcuQJGu3wVr+5Z2fMOK99EodzA@mail.gmail.com \
--to=jwakely.gcc@gmail.com \
--cc=fent@in.tum.de \
--cc=gcc-patches@gcc.gnu.org \
--cc=libstdc++@gcc.gnu.org \
/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).