libstdc++: Add pretty printer for std::span

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}

Signed-off-by: Philipp Fent <fent@in.tum.de>

libstdc++-v3/ChangeLog:

	* python/libstdcxx/v6/printers.py (StdSpanPrinter): Define.
	* testsuite/libstdc++-prettyprinters/cxx20.cc: Test it.
This commit is contained in:
Philipp Fent 2022-04-14 17:06:02 +01:00 committed by Jonathan Wakely
parent 214d2860f4
commit fdb3f82fb3
2 changed files with 49 additions and 0 deletions

View file

@ -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)

View file

@ -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
}