Don't compare types of enum fields

Comparing types of enum fields results in a crash, because they don't
have a type.

It can be reproduced by comparing the types of 2 instances of the same
enum type in different objects:

enum.h:

    enum e
    {
      zero,
      one,
    };

enum-1.c:

    #include <enum.h>
    int func();
    enum e e1;
    int main()
    {
      return e1 + func();
    }

enum-2.c:

    #include <enum.h>
    enum e e2;
    int func()
    {
      return e2;
    }

$ gcc -g -oenum enum-1.c enum-2.c
$ gdb -q enum.exe
Reading symbols from enum.exe...
(gdb) py print(gdb.parse_and_eval("e1").type==gdb.parse_and_eval("e2").type)

Thread 1 received signal SIGSEGV, Segmentation fault.
[Switching to Thread 6184.0x1cc4]
check_typedef (type=0x0) at C:/src/repos/binutils-gdb.git/gdb/gdbtypes.c:2745
2745      while (type->code () == TYPE_CODE_TYPEDEF)

gdb/ChangeLog:

2020-12-19  Hannes Domani  <ssbssa@yahoo.de>

	PR exp/27070
	* gdbtypes.c (check_types_equal): Don't compare types of enum fields.

gdb/testsuite/ChangeLog:

2020-12-19  Hannes Domani  <ssbssa@yahoo.de>

	PR exp/27070
	* gdb.python/compare-enum-type-a.c: New test.
	* gdb.python/compare-enum-type-b.c: New test.
	* gdb.python/compare-enum-type.exp: New file.
	* gdb.python/compare-enum-type.h: New test.
This commit is contained in:
Hannes Domani
2020-12-14 19:06:38 +01:00
parent 0455b7d325
commit fa639f555a
7 changed files with 119 additions and 1 deletions

View File

@ -4175,7 +4175,9 @@ check_types_equal (struct type *type1, struct type *type2,
case FIELD_LOC_KIND_ENUMVAL:
if (FIELD_ENUMVAL (*field1) != FIELD_ENUMVAL (*field2))
return false;
break;
/* Don't compare types of enum fields, because they don't
have a type. */
continue;
case FIELD_LOC_KIND_PHYSADDR:
if (FIELD_STATIC_PHYSADDR (*field1)
!= FIELD_STATIC_PHYSADDR (*field2))