[v2,06/30] Give names to unspecified types

Message ID 20240118-submit-domain-hacks-2-v2-6-aecab29fa104@tromey.com
State New
Headers
Series Restructure symbol domains |

Commit Message

Tom Tromey Jan. 18, 2024, 8:32 p.m. UTC
  A patch later in this series will change check_typedef to also look in
the type domain.  This change by itself caused a regression, but one
that revealed some peculiar behavior.

The regression is in nullptr_t.exp, where examining a std::nullptr_t
will change from the correct:

    typedef decltype(nullptr) std::nullptr_t;

to

    typedef void std::nullptr_t;

Right now, the DWARF reader marks all unspecified types as stub types.
However, this interacts weirdly with check_typedef, which currently
does not try to resolve types -- only struct-domain objects.

My first attempt here was to fix this by changing void types not to be
stub types, as I didn't see what value that provided.  However, this
caused another regression, because call_function_by_hand_dummy checks
for stub-ness:

  if (values_type == NULL || values_type->is_stub ())
    values_type = default_return_type;

I'm not really sure why it does this rather than check for
TYPE_CODE_VOID.

While looking into this, I found another oddity: the DWARF reader
correctly creates a type named 'decltype(nullptr)' when it seems a
DW_TAG_unspecified_type -- but it creates a symbol named "void"
instead.

This patch changes the DWARF reader to give the symbol the correct
name.  This avoids the regression.
---
 gdb/dwarf2/read.c | 1 +
 1 file changed, 1 insertion(+)
  

Patch

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index a4b8a855e24..078edd8c842 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -6593,6 +6593,7 @@  process_die (struct die_info *die, struct dwarf2_cu *cu)
     case DW_TAG_subrange_type:
     case DW_TAG_generic_subrange:
     case DW_TAG_typedef:
+    case DW_TAG_unspecified_type:
       /* Add a typedef symbol for the type definition, if it has a
 	 DW_AT_name.  */
       new_symbol (die, read_type_die (die, cu), cu);