From: Jan Kratochvil <jan.kratochvil@redhat.com>
To: Tom Tromey <tromey@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: RFC: handle case arising from GCC PR 47510
Date: Wed, 02 Feb 2011 21:12:00 -0000 [thread overview]
Message-ID: <20110202211220.GA9781@host1.dyn.jankratochvil.net> (raw)
In-Reply-To: <m3mxmefarc.fsf@fleche.redhat.com>
Hi Tom,
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
[...]
> + if (cu->language == language_cplus
> + && TYPE_CODE (TYPE_TARGET_TYPE (this_type)) == TYPE_CODE_STRUCT
> + && TYPE_TAG_NAME (TYPE_TARGET_TYPE (this_type)) == NULL
> + && maybe_smash_one_typedef (this_type, dwarf2_name (die, cu)))
> + {
> + /* We turned this typedef into a real structure type, so
> + make a pretend DIE to get new_symbol to do the right
> + thing. */
> + struct die_info fake = *die;
fake.attrs are invalid now while being accessed by new_symbol.
> +
> + fake.tag = DW_TAG_structure_type;
> + new_symbol (&fake, TYPE_TARGET_TYPE (this_type), cu);
> + }
> --- /dev/null
> +++ b/gdb/testsuite/gdb.cp/anon-struct.cc
> @@ -0,0 +1,15 @@
> +class C {
No copyright needed?
> +public:
> + C() {}
> + ~C() {}
If the destructor is not present maybe_smash_one_typedef() will not work. And
GDB crashes now due to it, that should be sanity-protected anyway.
> +};
> +
> +typedef struct {
> + C m;
> +} t;
> +typedef t S;
> +S v;
I would remove the intermediate type `S', it was there fore more illustrative
purposes.
> --- /dev/null
> +++ b/gdb/testsuite/gdb.cp/anon-struct.exp
> @@ -0,0 +1,25 @@
> +# Tests for anonymous union support.
> +# Copyright 2011 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> +
> +set testfile anon-struct
> +set srcfile ${testfile}.cc
> +set binfile ${objdir}/${subdir}/${testfile}
> +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug c++}] } {
> + return -1
> +}
> +
> +gdb_test "ptype t::t" "type = void \\(t \\* const\\)" \
> + "print type of t::t"
> diff --git a/gdb/valops.c b/gdb/valops.c
> index 24c2269..0287092 100644
> --- a/gdb/valops.c
> +++ b/gdb/valops.c
> @@ -3238,25 +3238,32 @@ value_struct_elt_for_reference (struct type *domain, int offset,
> j = -1;
> - for (ii = 0; ii < TYPE_FN_FIELDLIST_LENGTH (t, i);
> - ++ii)
> + for (ii = 0; ii < len; ++ii)
> {
> /* Skip artificial methods. This is necessary if,
> for example, the user wants to "print
> subclass::subclass" with only one user-defined
> - constructor. There is no ambiguity in this
> - case. */
> + constructor. There is no ambiguity in this case.
> + We are careful here to allow artificial methods
> + if they are the unique result. */
> if (TYPE_FN_FIELD_ARTIFICIAL (f, ii))
> - continue;
> + {
> + if (j == -1)
> + j = ii;
> + continue;
> + }
>
> /* Desired method is ambiguous if more than one
> method is defined. */
> - if (j != -1)
> + if (j != -1 && !TYPE_FN_FIELD_ARTIFICIAL (f, j))
> error (_("non-unique member `%s' requires "
> "type instantiation"), name);
>
> j = ii;
> }
> +
> + if (j == -1)
> + error (_("no matching member function"));
> }
I do not fully grok this change, it goes half way. Why two artificial methods
are not non-unique?
Thanks,
Jan
next prev parent reply other threads:[~2011-02-02 21:12 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-02 20:21 Tom Tromey
2011-02-02 21:12 ` Jan Kratochvil [this message]
2011-02-02 21:47 ` Michael Snyder
2011-02-02 21:50 ` copyright in testcase .cc [Re: RFC: handle case arising from GCC PR 47510] Jan Kratochvil
2011-02-02 21:58 ` Tom Tromey
2011-02-02 22:04 ` RFC: handle case arising from GCC PR 47510 Tom Tromey
2011-02-03 8:59 ` Jan Kratochvil
2011-02-03 21:07 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110202211220.GA9781@host1.dyn.jankratochvil.net \
--to=jan.kratochvil@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox