RE: C++ nested class bug/questions
"Willgerodt, Felix via Gdb" <[email protected]>
| Newsgroups | gmane.comp.gdb.devel |
|---|---|
| Message-ID | <[email protected]> |
> -----Original Message----- > From: Simon Marchi <[email protected]> > Sent: Dienstag, 22. Juni 2021 21:01 > To: Willgerodt, Felix <[email protected]>; [email protected] > Subject: Re: C++ nested class bug/questions > > On 2021-06-22 7:27 a.m., Willgerodt, Felix via Gdb wrote: > > Hello everyone, > > > > I was debugging a program similar to the one attached and noticed a > > couple of unexpected things happening. I compiled it with ”-g -O0” and > > g++ 11.1.0 (clang showed similar behaviour) and saw this: > > > > (gdb) bt > > #0 DF::vvv (this=0x7fffffffd120) at foo.cc:11 > > #1 0x0000555555555180 in foo () at foo.cc:16 > > #2 0x00005555555551a7 in main () at foo.cc:20 > > (gdb) ptype abcd > > type = class DF::FFFF { > > private: > > int ffff; > > } > > (gdb) ptype FFFF > > No symbol "FFFF" in current context. > > (gdb) ptype DF:: > > FFFF vvv() > > (gdb) ptype DF::FFFF > > There is no field named FFFF > > (gdb) ptype 'DF::FFFF' > > type = class DF::FFFF { > > private: > > int ffff; > > } > > (gdb) > > > > (The fourth command shows tab completion.) > > > > The problems I see are: > > 1) I think it shouldn’t be DF::FFFF. > > 2) 'ptype FFFF’ should just work as it is in the current scope. > > 3) There shouldn’t be a need to quote DF:FFFF, right? Although that might > just be a side-effect here. > > 4) The fact that a suggestion from tab completion doesn’t work is annoying. > This is probably also be a side-effect. > > > > Before debugging this further, I wanted to see if there are any > comments/suggestions. > > Am I even right about point 1? I couldn’t really find anything > > definitive in my favourite cpp reference on this type of nesting. g++ > > and clang output FFFF as foo()::DF::vvv()::FFFF as far as I can see. > > > > I don’t see any obvious problems in the dwarf that is produced. > > > > Thanks, > > Felix > > I'm not a reference on this topic, but at first glance I agree with you. > > Simon I looked into this a bit today, and this patch seems to solve it for me: diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 57bcfb713db..fbff05ac153 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -22589,7 +22589,7 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) && (dwarf2_name (parent, cu) != NULL)) return dwarf2_name (parent, cu); } - return determine_prefix (parent, cu); + return ""; case DW_TAG_enumeration_type: parent_type = read_type_die (parent, cu); if (parent_type->is_declared_class ()) With this patch I see no regressions in gdb.cp and gdb.fortran. But I am wondering why the current code even tries to go to the parent of the subprogram (which is the "first level" parent) to get a prefix? I don't really see a use case for it. But I am certainly not an expert in all languages that GDB understands and fear that I am just missing the point. Does anyone have an idea? I will try to test this more thoroughly and write a regression test in the meantime. Regards, Felix Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de> Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928