diff options
author | Sergio Durigan Junior <sergiodj@redhat.com> | 2018-07-07 17:16:55 -0400 |
---|---|---|
committer | Sergio Durigan Junior <sergiodj@redhat.com> | 2018-07-11 14:53:44 -0400 |
commit | 16ff70ddd430b63ca4dd68bf1d52828f2ed4f030 (patch) | |
tree | 4c395a03f14336687f735b71bc86a31319e58a53 /gdb | |
parent | cb19713281c69c3625dd447a0c2ce539761989e2 (diff) | |
download | gdb-16ff70ddd430b63ca4dd68bf1d52828f2ed4f030.zip gdb-16ff70ddd430b63ca4dd68bf1d52828f2ed4f030.tar.gz gdb-16ff70ddd430b63ca4dd68bf1d52828f2ed4f030.tar.bz2 |
Fix PR c++/23373: GDB hangs when printing a struct with a static member of itself
This patch fixes a failure that happens when a structure has a static
member whose type is the same as itself. From the bug report:
Example code:
struct A
{
static A Empty;
int a;
};
int main(void) {
A a;
return 0;
}
Output:
(gdb) ptype/o A
/* offset | size */ type = struct A {
static struct A {
static struct A {
static struct A {
static struct A {
static struct A {
static struct A {
... # infinite loop
The problem here is that GDB is not taking into account the fact that
static members inside a class/struct are not stored in the
class/struct, and therefore they should not be accounted for during
the display of the offsets/sizes. The fix is simple: we just check if
the field we're dealing with (on
c-typeprint.c:c_type_print_base_struct_union) is static, and if it is
then we don't iterate over it.
This patch also adds a new test for this case, and doesn't introduce
any regressions. I believe it is important enough to be included in
the 8.2 branch.
OK?
gdb/ChangeLog:
2018-07-11 Sergio Durigan Junior <sergiodj@redhat.com>
PR c++/23373
* c-typeprint.c (c_type_print_base_struct_union): Don't print
offsets/sizes for static members of a class/struct.
gdb/testsuite/ChangeLog:
2018-07-11 Sergio Durigan Junior <sergiodj@redhat.com>
PR c++/23373
* gdb.base/ptype-offsets.cc (struct static_member): New
struct.
(main) <stmember>: New variable.
* gdb.base/ptype-offsets.exp: Add test for printing a struct
with a static member in it.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/c-typeprint.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/ptype-offsets.cc | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/ptype-offsets.exp | 11 |
5 files changed, 35 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7c74c87..5ac6c60 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2018-07-11 Sergio Durigan Junior <sergiodj@redhat.com> + + PR c++/23373 + * c-typeprint.c (c_type_print_base_struct_union): Don't print + offsets/sizes for static members of a class/struct. + 2018-07-11 Alan Hayward <alan.hayward@arm.com> * target-descriptions.c (tdesc_register_bitsize): Rename. diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index c167e21..eccb972 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -1168,7 +1168,7 @@ c_type_print_base_struct_union (struct type *type, struct ui_file *stream, int newshow = show - 1; - if (flags->print_offsets + if (!is_static && flags->print_offsets && (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_STRUCT || TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_UNION)) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d073eda..f1b2a70 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2018-07-11 Sergio Durigan Junior <sergiodj@redhat.com> + + PR c++/23373 + * gdb.base/ptype-offsets.cc (struct static_member): New + struct. + (main) <stmember>: New variable. + * gdb.base/ptype-offsets.exp: Add test for printing a struct + with a static member in it. + 2018-07-10 Andrew Burgess <andrew.burgess@embecosm.com> * gdb.base/watchpoint-reuse-slot.exp: Test with hardware diff --git a/gdb/testsuite/gdb.base/ptype-offsets.cc b/gdb/testsuite/gdb.base/ptype-offsets.cc index 7b01dbc..e1aefe5 100644 --- a/gdb/testsuite/gdb.base/ptype-offsets.cc +++ b/gdb/testsuite/gdb.base/ptype-offsets.cc @@ -177,6 +177,13 @@ struct asd void *f16; }; +/* See PR c++/23373. */ + +struct static_member +{ + static static_member Empty; + int abc; +}; int main (int argc, char *argv[]) @@ -188,6 +195,7 @@ main (int argc, char *argv[]) struct tyu e; struct asd f; uint8_t i; + static_member stmember; return 0; } diff --git a/gdb/testsuite/gdb.base/ptype-offsets.exp b/gdb/testsuite/gdb.base/ptype-offsets.exp index d8718d5..ca0c5de 100644 --- a/gdb/testsuite/gdb.base/ptype-offsets.exp +++ b/gdb/testsuite/gdb.base/ptype-offsets.exp @@ -328,3 +328,14 @@ gdb_test_multiple "$test" "$test" { pass $test } } + +# Test that printing a struct with a static member of itself doesn't +# get us into an infinite loop. +gdb_test "ptype/o static_member" \ + [multi_line \ +{/\* offset | size \*/ type = struct static_member \{} \ +{ static static_member Empty;} \ +{\/* 0 | 4 \*/ int abc;} \ +{} \ +{ /\* total size \(bytes\): 4 \*/} \ +{ \}}] |