This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFC: handle case arising from GCC PR 47510


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]