PR libstdc++/87308 adjust regex used in std::any pretty printer
authorJonathan Wakely <jwakely@redhat.com>
Fri, 23 Nov 2018 15:48:56 +0000 (15:48 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 23 Nov 2018 15:48:56 +0000 (15:48 +0000)
The pretty printer for std::any fails when the contained value is a
locally-defined type, because the name in the debuginfo has
cv-qualifiers and ptr-declarators in different positions. The unexpected
format confuses the printer. This makes the printer's regex handle
either format.

This isn't a complete fix because looking up the contained type fails
when there are two types with the same name (defined in different local
scopes). This applies to all closure types defined in a given function,
as they all appear as "func()::lambda" in the debuginfo names.

PR libstdc++/87308 (partial)
* python/libstdcxx/v6/printers.py (StdExpAnyPrinter): Adjust regex to
work around PR 88166.
* testsuite/libstdc++-prettyprinters/cxx17.cc: Test std::any
containing a local type.

From-SVN: r266408

libstdc++-v3/ChangeLog
libstdc++-v3/python/libstdcxx/v6/printers.py
libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc

index 1e8072db07e407772fd1a9b455e88d7ac9b59cc9..2d86cc3efb44da9b2e6d634f5b26a9a5da3bae03 100644 (file)
@@ -1,3 +1,11 @@
+2018-11-23  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/87308 (partial)
+       * python/libstdcxx/v6/printers.py (StdExpAnyPrinter): Adjust regex to
+       work around PR 88166.
+       * testsuite/libstdc++-prettyprinters/cxx17.cc: Test std::any
+       containing a local type.
+
 2018-11-22  Marc Glisse  <marc.glisse@inria.fr>
 
        PR libstdc++/87106
index 827c87b70ea50f98d58892b7d953198f2ddcd93b..28733385dc977330342c1f05a7022439d4b0d215 100644 (file)
@@ -1051,7 +1051,7 @@ class StdExpAnyPrinter(SingleObjContainerPrinter):
             func = gdb.block_for_pc(int(mgr.cast(gdb.lookup_type('intptr_t'))))
             if not func:
                 raise ValueError("Invalid function pointer in %s" % self.typename)
-            rx = r"""({0}::_Manager_\w+<.*>)::_S_manage\({0}::_Op, {0} const\*, {0}::_Arg\*\)""".format(typename)
+            rx = r"""({0}::_Manager_\w+<.*>)::_S_manage\((enum )?{0}::_Op, (const {0}|{0} const) ?\*, (union )?{0}::_Arg ?\*\)""".format(typename)
             m = re.match(rx, func.function.name)
             if not m:
                 raise ValueError("Unknown manager function in %s" % self.typename)
index 0c7cb4c9bb6c704f979e68ab6ea336c46834cbc7..d3cd77c74db9d1fffe552a7eba3f3765ea8083de 100644 (file)
@@ -75,6 +75,9 @@ main()
 // { dg-final { regexp-test as2 {std::any containing const char \* = {\[contained value\] = 0x[[:xdigit:]]+ "stringiest"}} } }
   any am = *om;
 // { dg-final { note-test am {std::any containing std::map with 3 elements = {[1] = 2, [3] = 4, [5] = 6}} } }
+  struct local_type { int i = 99; };
+  any al = local_type{};
+// { dg-final { note-test al {std::any containing local_type = {[contained value] = {i = 99}}} } }
 
   struct S { operator int() { throw 42; }};
   variant<float, int, string_view> v0;