A user reported on irc that the std::unique_ptr pretty-printer yields
bad results. For example:
(gdb) p uptr
$1 = std::tuple containing = {
[1] = ,
[2] = {
<std::default_delete<datum>> = {<No data fields>}, <No data fields>}
}
This omits the actual pointer and prints some useless stuff instead.
This patch fixes the printer and adds a test.
The new output looks like this:
$11 = std::unique_ptr containing (datum *) 0x6067d0
Let me know what you think.
Tom
b/libstdc++-v3/ChangeLog:
2012-08-10 Tom Tromey <[email protected]>
* testsuite/libstdc++-prettyprinters/cxx11.cc (struct datum):
New.
(global): New global.
(main): Add test for unique_ptr.
* python/libstdcxx/v6/printers.py
(UniquePointerPrinter.to_string): Extract the pointer and also
print its type.
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py
b/libstdc++-v3/python/libstdcxx/v6/printers.py
index 4520f32..dcb98de 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -71,7 +71,8 @@ class UniquePointerPrinter:
self.val = val
def to_string (self):
- return self.val['_M_t']
+ v = self.val['_M_t']['_M_head_impl']
+ return 'std::unique_ptr containing (' + str(v.type) + ') ' + str(v)
class StdListPrinter:
"Print a std::list"
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc
b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc
index 54b3275..7e2e240 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc
@@ -48,6 +48,14 @@ use(const T &container)
placeholder(*i);
}
+struct datum
+{
+ std::string s;
+ int i;
+};
+
+std::unique_ptr<datum> global;
+
int
main()
{
@@ -86,6 +94,11 @@ main()
uoms.insert(5);
// { dg-final { note-test uoms {std::unordered_multiset with 1 elements = {[0]
= 5}} } }
+ std::unique_ptr<datum> uptr (new datum);
+ uptr->s = "hi bob";
+ uptr->i = 23;
+// { dg-final { regexp-test uptr {std::unique_ptr containing .datum .. 0x.*} }
}
+
placeholder(""); // Mark SPOT
use(efl);
use(fl);
@@ -93,6 +106,8 @@ main()
use(eumm);
use(eus);
use(eums);
+ use(uoms);
+ use(uptr->s);
return 0;
}