From: Jonathan Wakely Date: Fri, 10 Mar 2023 11:06:25 +0000 (+0000) Subject: libstdc++: Fix GDB Xmethod for std::shared_ptr::use_count() [PR109064] X-Git-Tag: releases/gcc-10.5.0~172 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cc75195ee8811d6c48f05727c170916c0adc227b;p=thirdparty%2Fgcc.git libstdc++: Fix GDB Xmethod for std::shared_ptr::use_count() [PR109064] libstdc++-v3/ChangeLog: PR libstdc++/109064 * python/libstdcxx/v6/xmethods.py (SharedPtrUseCountWorker): Remove self-recursion in __init__. Add missing _supports. * testsuite/libstdc++-xmethods/shared_ptr.cc: Check use_count() and unique(). --- diff --git a/libstdc++-v3/python/libstdcxx/v6/xmethods.py b/libstdc++-v3/python/libstdcxx/v6/xmethods.py index 2617c189e404..cd535fb5ed68 100644 --- a/libstdc++-v3/python/libstdcxx/v6/xmethods.py +++ b/libstdc++-v3/python/libstdcxx/v6/xmethods.py @@ -730,7 +730,7 @@ class SharedPtrUseCountWorker(gdb.xmethod.XMethodWorker): "Implements std::shared_ptr::use_count()" def __init__(self, elem_type): - SharedPtrUseCountWorker.__init__(self, elem_type) + pass def get_arg_types(self): return None @@ -738,6 +738,9 @@ class SharedPtrUseCountWorker(gdb.xmethod.XMethodWorker): def get_result_type(self, obj): return gdb.lookup_type('long') + def _supports(self, method_name): + return True + def __call__(self, obj): refcounts = obj['_M_refcount']['_M_pi'] return refcounts['_M_use_count'] if refcounts else 0 diff --git a/libstdc++-v3/testsuite/libstdc++-xmethods/shared_ptr.cc b/libstdc++-v3/testsuite/libstdc++-xmethods/shared_ptr.cc index 05fdd57ec3f5..e7a79d67d598 100644 --- a/libstdc++-v3/testsuite/libstdc++-xmethods/shared_ptr.cc +++ b/libstdc++-v3/testsuite/libstdc++-xmethods/shared_ptr.cc @@ -36,6 +36,8 @@ main () std::shared_ptr s(new x_struct[2]{ {92}, {115} }); + auto qq = q; + // { dg-final { note-test *p 10 } } // { dg-final { regexp-test p.get() 0x.* } } @@ -66,6 +68,11 @@ main () // { dg-final { whatis-test s.get() "x_struct \*" } } // { dg-final { whatis-test s\[1].y int } } +// { dg-final { note-test p.use_count() 1 } } +// { dg-final { note-test p.unique() true } } +// { dg-final { note-test q.use_count() 2 } } +// { dg-final { note-test q.unique() false } } + return 0; // Mark SPOT }