public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-10662] libstdc++: Add pretty printer for std::span
@ 2023-04-27 22:01 Jonathan Wakely
  0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2023-04-27 22:01 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:71b813c37f17c845ac34fb1978309b7b635ab04f

commit r11-10662-g71b813c37f17c845ac34fb1978309b7b635ab04f
Author: Philipp Fent <fent@in.tum.de>
Date:   Thu Apr 14 17:06:02 2022 +0100

    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.
    
    (cherry picked from commit fdb3f82fb324c3ddd7464d11c8ea60a98f486a0e)

Diff:
---
 libstdc++-v3/python/libstdcxx/v6/printers.py       | 38 ++++++++++++++++++++++
 .../testsuite/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 b5b523c4b5a..16bdfac8f5a 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1626,6 +1626,43 @@ class StdErrorCodePrinter:
         return '%s = {%s: %s}' % (self.typename, name, strval)
 
 
+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):
@@ -2138,6 +2175,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 d9b47114d57..c0eded2302a 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
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-27 22:01 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-27 22:01 [gcc r11-10662] libstdc++: Add pretty printer for std::span Jonathan Wakely

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