[PATCH] libstdc++: Fix num_children of the map pretty-printers
Jonathan Wakely
jwakely@redhat.com
Tue Jul 28 10:03:57 GMT 2026
On Mon, 27 Jul 2026 at 19:02, <david.faure@kdab.com> wrote:
>
> From: David Faure <david.faure@kdab.com>
>
> StdMapPrinter and Tr1UnorderedMapPrinter yield a separate child for the
> key and for the value of every element, as their 'map' display hint
> requires, but their num_children methods return the number of elements,
> i.e. half of what children() produces.
>
> GDB counts the children itself where it does not use num_children, so
> the two disagree about the same map. For a std::map with 2 elements:
>
> (gdb) interpreter-exec mi "-enable-pretty-printing"
> (gdb) interpreter-exec mi "-var-create v * m"
> (gdb) interpreter-exec mi "-var-list-children v"
> ^done,numchild="4",displayhint="map",children=[...]
>
> while num_children() returns 2. The DAP code in gdb treats the two as
> interchangeable: gdb/python/lib/gdb/dap/varref.py calls num_children()
> when the printer has one, and falls back to len(list(children())) when
> it does not, so a DAP client sees half the children of a std::map,
> std::multimap or std::unordered_map.
>
> StdSetPrinter and the sequence container printers yield one child per
> element, so they are correct as they are.
>
> libstdc++-v3/ChangeLog
>
> * python/libstdcxx/v6/printers.py (StdMapPrinter.num_children):
> Count two children per element.
> (Tr1UnorderedMapPrinter.num_children): Likewise.
>
> Signed-off-by: David Faure <david.faure@kdab.com>
Thanks, pushed to trunk and I'll backport it to gcc-16.
> ---
> libstdc++-v3/python/libstdcxx/v6/printers.py | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
> index eff4b72..1bba377 100644
> --- a/libstdc++-v3/python/libstdcxx/v6/printers.py
> +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
> @@ -909,7 +909,8 @@ class StdMapPrinter(printer_base):
> return self._iter(RbtreeIterator(self._val), node)
>
> def num_children(self):
> - return len(RbtreeIterator(self._val))
> + # Each element produces two children, the key and the value.
> + return 2 * len(RbtreeIterator(self._val))
>
> def display_hint(self):
> return 'map'
> @@ -1301,7 +1302,8 @@ class Tr1UnorderedMapPrinter(printer_base):
> return izip(counter, data)
>
> def num_children(self):
> - return int(self._hashtable()['_M_element_count'])
> + # Each element produces two children, the key and the value.
> + return 2 * int(self._hashtable()['_M_element_count'])
>
> def display_hint(self):
> return 'map'
> --
> 2.55.0
>
More information about the Libstdc++
mailing list