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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.