Handle complex error type in read_base_type
authorTom Tromey <tromey@adacore.com>
Mon, 6 Apr 2020 18:13:24 +0000 (12:13 -0600)
committerTom Tromey <tromey@adacore.com>
Mon, 6 Apr 2020 18:29:09 +0000 (12:29 -0600)
It turns out there was one more bug in the earlier complex series:
read_base_type could cause an assertion failure on some platforms.  I
found this running the AdaCore internal test suite, but you can also
see it by running gdb's "gdb.cp" tests for x86 (not x86-64).

In particular, the DW_ATE_complex_float case calls
dwarf2_init_complex_target_type, which calls dwarf2_init_float_type,
which can return a type using TYPE_CODE_ERROR.

This patch changes the DWARF reader to handle this case, the same way
that the f-lang.c patch did.  Perhaps init_complex_type really should
be changed to allow TYPE_CODE_ERROR?  I was not sure.

Tested on x86-64 Fedora 30, using an x86 build.  I'm checking this in.

gdb/ChangeLog
2020-04-06  Tom Tromey  <tromey@adacore.com>

* dwarf2/read.c (read_base_type) <DW_ATE_complex_float>: Handle
TYPE_CODE_ERROR.

gdb/ChangeLog
gdb/dwarf2/read.c

index b1a965304a471d962426c40e440e8b5356a7cbb2..cdf6d66787216a267664574857cfe569a79fb58e 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-06  Tom Tromey  <tromey@adacore.com>
+
+       * dwarf2/read.c (read_base_type) <DW_ATE_complex_float>: Handle
+       TYPE_CODE_ERROR.
+
 2020-04-06  Kamil Rytarowski  <n54@gmx.com>
 
        * nbsd-tdep.c: Include "gdbarch.h".
index bcc3116071eed24e46c93e29de6083efbfafd028..749acb3ba26cd3f6b06a24967b1d02c9d78bf352 100644 (file)
@@ -16910,7 +16910,19 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
       case DW_ATE_complex_float:
        type = dwarf2_init_complex_target_type (cu, objfile, bits / 2, name,
                                                byte_order);
-       type = init_complex_type (name, type);
+       if (TYPE_CODE (type) == TYPE_CODE_ERROR)
+         {
+           if (name == nullptr)
+             {
+               struct obstack *obstack
+                 = &cu->per_cu->dwarf2_per_objfile->objfile->objfile_obstack;
+               name = obconcat (obstack, "_Complex ", TYPE_NAME (type),
+                                nullptr);
+             }
+           type = init_type (objfile, TYPE_CODE_ERROR, bits, name);
+         }
+       else
+         type = init_complex_type (name, type);
        break;
       case DW_ATE_decimal_float:
        type = init_decfloat_type (objfile, bits, name);