From: Simon Marchi Date: Thu, 24 Apr 2025 15:13:37 +0000 (-0400) Subject: gdb: fix completion of anonymous struct members X-Git-Tag: binutils-2_45~811 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a163e2015a4e2f9b6701832d3c40f848524e4793;p=thirdparty%2Fbinutils-gdb.git gdb: fix completion of anonymous struct members Completing fields inside an anonymous struct does not work. With: struct commit_counters_hot { union { struct { long owner; }; char padding[16]; }; }; I get: (gdb) complete print cc_hot. print cc_hot.padding After this patch, I get: (gdb) complete print cc_hot. print cc_hot.owner print cc_hot.padding Update break1.c to include an anonymous struct. The tests that complete "z_field" inside gdb.base/completion.exp would start to fail without the fix. Change-Id: I46b65a95ad16b0825de58dfa241777fe57acc361 Reviewed-By: Keith Seitz --- diff --git a/gdb/eval.c b/gdb/eval.c index 95d2532af8f..19770ad63d6 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -994,9 +994,10 @@ add_struct_fields (struct type *type, completion_list &output, output.emplace_back (concat (prefix, type->field (i).name (), nullptr)); } - else if (type->field (i).type ()->code () == TYPE_CODE_UNION) + else if (type->field (i).type ()->code () == TYPE_CODE_UNION + || type->field (i).type ()->code () == TYPE_CODE_STRUCT) { - /* Recurse into anonymous unions. */ + /* Recurse into anonymous unions and structures. */ add_struct_fields (type->field (i).type (), output, fieldname, namelen, prefix); } diff --git a/gdb/testsuite/gdb.base/break1.c b/gdb/testsuite/gdb.base/break1.c index 110341c1377..26c4663edc3 100644 --- a/gdb/testsuite/gdb.base/break1.c +++ b/gdb/testsuite/gdb.base/break1.c @@ -23,7 +23,13 @@ struct some_struct { int a_field; int b_field; - union { int z_field; }; + union + { + struct + { + int z_field; + }; + }; }; struct some_struct values[50];