[PATCH] PR libstdc++/80276 fix pretty printers for array smart pointers

Jonathan Wakely jwakely@redhat.com
Tue Jan 9 21:59:00 GMT 2018


This fixes unique_ptr<T[]> so it doesn't print as unique_ptr<T>, and
fixes a problem in the type-printers that can result in a gdb.error
exception (see https://sourceware.org/PR22686).

	PR libstdc++/80276
	* python/libstdcxx/v6/printers.py (SharedPointerPrinter)
	(UniquePointerPrinter): Print correct template argument, not type of
	the pointer.
	(TemplateTypePrinter._recognizer.recognize): Handle failure to lookup
	a type.
	* testsuite/libstdc++-prettyprinters/cxx11.cc: Test unique_ptr of
	array type.
	* testsuite/libstdc++-prettyprinters/cxx17.cc: Test shared_ptr and
	weak_ptr of array types.

Tested x86_64-linux, committed to trunk.


-------------- next part --------------
commit 66a3c835f217136961466e870b6c3fdb82b381d7
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Jan 9 20:57:19 2018 +0000

    PR libstdc++/80276 fix pretty printers for array smart pointers
    
            PR libstdc++/80276
            * python/libstdcxx/v6/printers.py (SharedPointerPrinter)
            (UniquePointerPrinter): Print correct template argument, not type of
            the pointer.
            (TemplateTypePrinter._recognizer.recognize): Handle failure to lookup
            a type.
            * testsuite/libstdc++-prettyprinters/cxx11.cc: Test unique_ptr of
            array type.
            * testsuite/libstdc++-prettyprinters/cxx17.cc: Test shared_ptr and
            weak_ptr of array types.

diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index e9f7359d63f..d6de0969e1c 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -150,7 +150,7 @@ class SharedPointerPrinter:
                 state = 'expired, weak count %d' % weakcount
             else:
                 state = 'use count %d, weak count %d' % (usecount, weakcount - 1)
-        return '%s<%s> (%s)' % (self.typename, str(self.pointer.type.target().strip_typedefs()), state)
+        return '%s<%s> (%s)' % (self.typename, str(self.val.type.template_argument(0)), state)
 
 class UniquePointerPrinter:
     "Print a unique_ptr"
@@ -169,7 +169,7 @@ class UniquePointerPrinter:
         return SmartPtrIterator(self.pointer)
 
     def to_string (self):
-        return ('std::unique_ptr<%s>' % (str(self.pointer.type.target())))
+        return ('std::unique_ptr<%s>' % (str(self.val.type.template_argument(0))))
 
 def get_value_from_aligned_membuf(buf, valtype):
     """Returns the value held in a __gnu_cxx::__aligned_membuf."""
@@ -1328,9 +1328,13 @@ class TemplateTypePrinter(object):
                 for i, sub in enumerate(subs):
                     if ('{%d}' % (i+1)) in self.subst:
                         # apply recognizers to subgroup
+                        try:
+                            subtype = gdb.lookup_type(sub)
+                        except gdb.error:
+                            continue
                         rep = gdb.types.apply_type_recognizers(
                                 gdb.types.get_type_recognizers(),
-                                gdb.lookup_type(sub))
+                                subtype)
                         if rep:
                             subs[i] = rep
                 subs = [None] + subs
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc
index 3af564f2bf7..0ecc3771351 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc
@@ -131,6 +131,12 @@ main()
   std::unique_ptr<datum> &ruptr = uptr;
 // { dg-final { regexp-test ruptr {std::unique_ptr.datum. = {get\(\) = 0x.*}} } }
 
+  using data = datum[];
+  std::unique_ptr<data> arrptr (new datum[2]);
+// { dg-final { regexp-test arrptr {std::unique_ptr.datum \[\]. = {get\(\) = 0x.*}} } }
+  std::unique_ptr<data>& rarrptr = arrptr;
+// { dg-final { regexp-test rarrptr {std::unique_ptr.datum \[\]. = {get\(\) = 0x.*}} } }
+
   ExTuple tpl(6,7);
 // { dg-final { note-test tpl {std::tuple containing = {[1] = 6, [2] = 7}} } }
   ExTuple &rtpl = tpl;
@@ -144,6 +150,7 @@ main()
   use(eums);
   use(uoms);
   use(uptr->s);
+  use(arrptr[0].s);
 
   std::cout << "\n";
   return 0;
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc
index c11bb33086b..0c7cb4c9bb6 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc
@@ -29,6 +29,7 @@
 #include <string>
 #include <map>
 #include <unordered_set>
+#include <memory>
 #include <iostream>
 
 using std::any;
@@ -37,6 +38,8 @@ using std::variant;
 using std::string_view;
 using std::map;
 using std::unordered_set;
+using std::shared_ptr;
+using std::weak_ptr;
 
 int
 main()
@@ -100,6 +103,18 @@ main()
   unordered_set<int>::node_type n3 = s.extract(3);
 // { dg-final { note-test n1 {node handle for unordered set with element = {3}}}}
 
+  shared_ptr<int[]> p(new int[1]);
+  weak_ptr wp = p;
+  weak_ptr wp2 = p;
+// { dg-final { regexp-test p {std::shared_ptr.int \[\]. \(use count 1, weak count 2\) = {get\(\) = 0x.*}} } }
+// { dg-final { regexp-test wp {std::weak_ptr.int \[\]. \(use count 1, weak count 2\) = {get\(\) = 0x.*}} } }
+
+  shared_ptr<int[2]> q(new int[2]);
+  shared_ptr q2 = q;
+  weak_ptr wq = q;
+// { dg-final { regexp-test q {std::shared_ptr.int \[2\]. \(use count 2, weak count 1\) = {get\(\) = 0x.*}} } }
+// { dg-final { regexp-test wq {std::weak_ptr.int \[2\]. \(use count 2, weak count 1\) = {get\(\) = 0x.*}} } }
+
   std::cout << "\n";
   return 0;			// Mark SPOT
 }


More information about the Gcc-patches mailing list