This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA] mi/10586
On 11/14/2011 10:17 AM, Tom Tromey wrote:
It also seems like it will do the wrong thing for -var-info-expression and
-var-info-path-expression.
Hmm. Yeah, those will need special handling.
Consider:
struct a
{
struct {
int b;
};
struct {
int c;
};
};
-var-create a * a
-var-list-children a = "public" (if c++)
-var-list-children a.public = "0_anonymous", "1_anonymous"
-var-list-children a.public.0_anonymous = "b" (via "public" if c++)
-var-list-children a.public.1_anonymous = "c" (via "public" if c++)
So far, so good, I think.
Now:
-var-info-expression a = "a"
-var-info-expression a.public = "public"
-var-info-expression a.public.0_anonymous = "0_anonymous"
-var-info-expression a.public.0_anonymous.b = "b"
According to the documentation, -var-info-expression is supposed to
return a name of the variable/child which is to be presented to the
user. I don't think we want to present "0_anonymous". GCC uses
"<anonymous struct>", and that seems like a reasonable convention to follow.
-var-info-path-expression a = "a"
-var-info-path-expression a.public = ""
-var-info-path-expression a.public.0_anonymous = "((a).2_anonymous)"
-var-info-path-expression a.public.0_anonymous.b = "((((a).0_anonymous)).b)"
The documentation on this command says that it should return a valid
expression that may be used, e.g., to create another varobj or to set a
watchpoint.
Clearly the two last elements dealing with 0_anonymous are incorrect. I
believe these should be:
-var-info-path-expression a.public.0_anonymous = ""
-var-info-path-expression a.public.0_anonymous.b = "((a).b)"
If we can agree what to do, I shall set about implementing the desired
change.
Keith