diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-01-09 21:46:13 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-01-09 21:46:13 +0000 |
commit | 8273aa77d4e122fd036b1555b1a6f2496887e481 (patch) | |
tree | bc03ad244623172d08b5c2628d2d373fd440eb55 | |
parent | ee6019ce5d3bc7e80ab1d8b8d2fbad3351ff778b (diff) | |
download | gcc-8273aa77d4e122fd036b1555b1a6f2496887e481.zip gcc-8273aa77d4e122fd036b1555b1a6f2496887e481.tar.gz gcc-8273aa77d4e122fd036b1555b1a6f2496887e481.tar.bz2 |
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.
From-SVN: r256400
-rw-r--r-- | libstdc++-v3/ChangeLog | 13 | ||||
-rw-r--r-- | libstdc++-v3/python/libstdcxx/v6/printers.py | 10 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc | 7 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc | 15 |
4 files changed, 42 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 07dbb5f..6c5a274 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2018-01-09 Jonathan Wakely <jwakely@redhat.com> + + 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. + 2018-01-09 François Dumont <fdumont@gcc.gnu.org> PR libstdc++/83709 diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index e9f7359..d6de096 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 3af564f..0ecc377 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 c11bb33..0c7cb4c 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 } |