public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "mikael at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug fortran/45586] [4.6 Regression] ICE non-trivial conversion at assignment
Date: Tue, 25 Jan 2011 14:59:00 -0000	[thread overview]
Message-ID: <bug-45586-4-h11qvv4ICh@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-45586-4@http.gcc.gnu.org/bugzilla/>

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45586

--- Comment #38 from Mikael Morin <mikael at gcc dot gnu.org> 2011-01-25 14:32:28 UTC ---

The patch looks good. 
Somewhat hackish as you acknowledge, but worth submitting anyway. 
A few minor comments below. 


> Index: fortran/trans-expr.c
> ===================================================================
> --- fortran/trans-expr.c	(revision 168749)
> +++ fortran/trans-expr.c	(working copy)
> @@ -504,6 +504,19 @@ gfc_conv_component_ref (gfc_se * se, gfc
>    field = c->backend_decl;
>    gcc_assert (TREE_CODE (field) == FIELD_DECL);
>    decl = se->expr;
> +  if (DECL_CONTEXT (field) != TREE_TYPE (decl))
> +    {
> +      tree f2 = c->backend_decl2;
> +      if (f2 && DECL_FIELD_CONTEXT (f2) == TREE_TYPE (decl))
> +	;
> +      else for (f2 = TYPE_FIELDS (TREE_TYPE (decl)); f2; f2 = DECL_CHAIN (f2))

I prefer `if (!cond) ...' instead of `if (cond) ; else ...'


> Index: fortran/gfortran.h
> ===================================================================
> --- fortran/gfortran.h	(revision 168749)
> +++ fortran/gfortran.h	(working copy)
> @@ -934,6 +934,7 @@ typedef struct gfc_component
>    gfc_array_spec *as;
>  
>    tree backend_decl;
> +  tree backend_decl2;
More descriptive name (e.g. restrict_backend_decl or target_backend_decl or
...)
and comment explaining the need for it appreciated. 

One could have the combinatorial explosion of backend_decls here as said
Michael. In any case it can be safely removed if needed, as it is just a cache.


>    locus loc;
>    struct gfc_expr *initializer;
>    struct gfc_component *next;
> Index: fortran/trans-types.c
> ===================================================================
> --- fortran/trans-types.c	(revision 168749)
> +++ fortran/trans-types.c	(working copy)
> @@ -1746,6 +1746,80 @@ gfc_build_pointer_type (gfc_symbol * sym
>    else
>      return build_pointer_type (type);
>  }
> +
> +static tree
> +gfc_nonrestricted_type (tree t)
> +{
> +  tree ret = t;
> +  if (!TYPE_LANG_SPECIFIC (t))
> +    TYPE_LANG_SPECIFIC (t)
> +      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
> +  if (TYPE_LANG_SPECIFIC (t)->nonrestricted_type)
> +    return TYPE_LANG_SPECIFIC (t)->nonrestricted_type;
> +  switch (TREE_CODE (t))
> +    {
> +      default:
> +	break;
> +
> +      case POINTER_TYPE:
> +      case REFERENCE_TYPE:
> +	ret = build_qualified_type (t, TYPE_QUALS (t) & ~TYPE_QUAL_RESTRICT);

Isn't it necessary to call gfc_nonrestricted_type on TREE_TYPE (t) here ?


> +	break;
> +
> +      case ARRAY_TYPE:
> +	{
> +	  tree elemtype = gfc_nonrestricted_type (TREE_TYPE (t));
> +	  if (elemtype == TREE_TYPE (t))
> +	    ret = t;
> +	  else
> +	    {
> +	      ret = copy_node (t);
> +	      TREE_TYPE (t) = elemtype;
> +	      /* ??? Change some TYPE_LANG_SPECIFICs too?  */
> +	    }
> +	}
> +	break;
> +
> +      case RECORD_TYPE:
> +      case UNION_TYPE:
> +      case QUAL_UNION_TYPE:
> +	{
> +	  tree field, *chain;
> +	  for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field))
> +	    if (TREE_CODE (field) == FIELD_DECL)
> +	      {
> +		tree elemtype = gfc_nonrestricted_type (TREE_TYPE (field));
> +		if (elemtype != TREE_TYPE (field))
> +		  break;
> +	      }
> +	  if (!field)
> +	    break;
> +	  ret = copy_node (t);
> +	  TYPE_FIELDS (ret) = NULL_TREE;
> +	  chain = &TYPE_FIELDS (ret);
> +	  for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field))
> +	    {
> +	      tree newfield = copy_node (field);
> +	      DECL_CONTEXT (newfield) = ret;
> +	      DECL_CHAIN (newfield) = NULL_TREE;
> +	      if (TYPE_FIELDS (ret) == NULL_TREE)
> +		TYPE_FIELDS (ret) = newfield;

Those two lines seem to duplicate the line below (as initially chain points to
&TYPE_FIELDS(ret)). 


> +	      *chain = newfield;
> +	      chain = &DECL_CHAIN (newfield);
> +
> +	      if (TREE_CODE (field) == FIELD_DECL)
> +		{
> +		  tree elemtype = gfc_nonrestricted_type (TREE_TYPE (field));
> +		  TREE_TYPE (newfield) = elemtype;
> +		}
> +	    }
> +	}
> +        break;
> +    }
> +  TYPE_LANG_SPECIFIC (t)->nonrestricted_type = ret;

Don't know if it is absolutely necessary, but one might add also :
TYPE_LANG_SPECIFIC (ret)->nonrestricted_type = ret;


> +  return ret;
> +}
> +
>  \f
>  /* Return the type for a symbol.  Special handling is required for character
>     types to get the correct level of indirection.
> @@ -1789,6 +1863,9 @@ gfc_sym_type (gfc_symbol * sym)
>    else
>      type = gfc_typenode_for_spec (&sym->ts);
>  
> +  if (sym->attr.pointer)
> +    type = gfc_nonrestricted_type (type);
> +

This is missing the target attribute, so you may preferably use the restricted
boolean a few lines below. 


>    if (sym->attr.dummy && !sym->attr.function && !sym->attr.value)
>      byref = 1;
>    else
> Index: fortran/trans.h
> ===================================================================
> --- fortran/trans.h	(revision 168749)
> +++ fortran/trans.h	(working copy)
> @@ -700,6 +700,7 @@ struct GTY((variable_size))	lang_type	 {
>    tree dataptr_type;
>    tree span;
>    tree base_decl[2];
> +  tree nonrestricted_type;
>  };
>  
>  struct GTY((variable_size)) lang_decl {


  parent reply	other threads:[~2011-01-25 14:33 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-45586-4@http.gcc.gnu.org/bugzilla/>
2010-09-24 10:43 ` [Bug lto/45586] " Joost.VandeVondele at pci dot uzh.ch
2010-09-24 11:17 ` Joost.VandeVondele at pci dot uzh.ch
2010-09-30 15:50 ` rguenth at gcc dot gnu.org
2010-10-21 15:28 ` rguenth at gcc dot gnu.org
2010-11-25 16:59 ` [Bug fortran/45586] " rguenth at gcc dot gnu.org
2010-11-25 17:00 ` rguenth at gcc dot gnu.org
2010-11-25 17:07 ` Joost.VandeVondele at pci dot uzh.ch
2010-11-25 17:44 ` matz at gcc dot gnu.org
2010-11-25 18:04 ` matz at gcc dot gnu.org
2010-11-26 10:27 ` Joost.VandeVondele at pci dot uzh.ch
2010-11-26 12:23 ` rguenth at gcc dot gnu.org
2010-11-26 12:49 ` Joost.VandeVondele at pci dot uzh.ch
2010-11-26 13:45 ` rguenth at gcc dot gnu.org
2010-11-26 13:55 ` burnus at gcc dot gnu.org
2010-11-26 14:02 ` Joost.VandeVondele at pci dot uzh.ch
2010-11-26 14:40 ` rguenther at suse dot de
2010-11-26 14:43 ` rguenth at gcc dot gnu.org
2011-01-13 15:49 ` burnus at gcc dot gnu.org
2011-01-16 13:04 ` tkoenig at gcc dot gnu.org
2011-01-16 15:18 ` mikael at gcc dot gnu.org
2011-01-16 16:37 ` tkoenig at netcologne dot de
2011-01-17 11:30 ` rguenth at gcc dot gnu.org
2011-01-17 13:42 ` mikael at gcc dot gnu.org
2011-01-17 13:50 ` burnus at gcc dot gnu.org
2011-01-17 14:15 ` matz at gcc dot gnu.org
2011-01-18 12:57 ` mikael at gcc dot gnu.org
2011-01-18 13:47 ` rguenther at suse dot de
2011-01-18 14:20 ` matz at gcc dot gnu.org
2011-01-18 17:38 ` mikael at gcc dot gnu.org
2011-01-19 16:48 ` matz at gcc dot gnu.org
2011-01-20 16:56 ` matz at gcc dot gnu.org
2011-01-21 23:20 ` mikael at gcc dot gnu.org
2011-01-24  9:55 ` rguenther at suse dot de
2011-01-25 14:59 ` mikael at gcc dot gnu.org [this message]
2011-01-25 15:03 ` mikael at gcc dot gnu.org
2011-01-25 15:13 ` Joost.VandeVondele at pci dot uzh.ch
2011-01-25 15:13 ` matz at gcc dot gnu.org
2011-01-25 22:28 ` mikael at gcc dot gnu.org
2011-01-26 13:13 ` matz at gcc dot gnu.org
2011-02-07 22:20 ` janus at gcc dot gnu.org
2011-02-12 13:12 ` burnus at gcc dot gnu.org
2011-02-12 13:24 ` burnus at gcc dot gnu.org
2011-02-12 15:05 ` mikael at gcc dot gnu.org
2011-02-13 17:51 ` jsm28 at gcc dot gnu.org
2011-02-18 19:54 ` matz at gcc dot gnu.org
2011-02-18 20:21 ` matz at gcc dot gnu.org
2011-04-05 15:10 ` Joost.VandeVondele at pci dot uzh.ch
2011-04-05 15:16 ` [Bug fortran/45586] [4.6/4.7 " rguenth at gcc dot gnu.org
2011-04-11  9:10 ` burnus at gcc dot gnu.org
2011-04-12  5:50 ` Joost.VandeVondele at pci dot uzh.ch
2011-04-13 18:47 ` Joost.VandeVondele at pci dot uzh.ch
2011-04-26 14:09 ` burnus at gcc dot gnu.org
2011-04-26 18:18 ` Joost.VandeVondele at pci dot uzh.ch
2011-04-26 18:24 ` Joost.VandeVondele at pci dot uzh.ch
2011-04-26 19:37 ` tkoenig at gcc dot gnu.org
2011-06-27 15:50 ` jakub at gcc dot gnu.org
2011-07-26 14:28 ` burnus at gcc dot gnu.org
2011-07-27 22:35 ` burnus at gcc dot gnu.org
2011-07-28  5:41 ` burnus at gcc dot gnu.org
2011-07-28  5:44 ` burnus at gcc dot gnu.org
2012-02-14 13:03 ` rguenth at gcc dot gnu.org
2012-02-14 13:23 ` rguenth at gcc dot gnu.org
2012-03-07  9:48 ` rguenth at gcc dot gnu.org
2012-03-07  9:51 ` [Bug fortran/45586] [4.8 " rguenth at gcc dot gnu.org
2012-03-12 10:16 ` dominiq at lps dot ens.fr
2012-05-11  8:33 ` rguenth at gcc dot gnu.org
2012-07-28  9:47 ` mikael at gcc dot gnu.org
2012-07-30  8:44 ` rguenther at suse dot de
2012-07-30 10:37 ` mikael at gcc dot gnu.org
2012-07-30 11:06 ` rguenther at suse dot de
2012-07-30 12:31 ` mikael at gcc dot gnu.org
2012-07-30 12:34 ` rguenther at suse dot de
2012-08-01 12:23 ` mikael at gcc dot gnu.org
2012-08-01 12:29 ` rguenther at suse dot de
2012-08-01 12:39 ` mikael at gcc dot gnu.org
2012-08-01 15:03 ` mikael at gcc dot gnu.org
2012-08-01 15:06 ` rguenther at suse dot de
2012-08-01 16:24 ` burnus at gcc dot gnu.org
2012-08-01 18:39 ` mikael at gcc dot gnu.org
2012-09-04 12:23 ` Joost.VandeVondele at mat dot ethz.ch
2012-09-26  6:43 ` Joost.VandeVondele at mat dot ethz.ch
2012-09-26  9:38 ` burnus at gcc dot gnu.org
2012-09-26 16:07 ` mikael at gcc dot gnu.org
2012-09-30 12:31 ` Joost.VandeVondele at mat dot ethz.ch
2012-11-15 22:46 ` bergner at gcc dot gnu.org
2012-12-13  8:42 ` Joost.VandeVondele at mat dot ethz.ch
2012-12-13 12:07 ` rguenth at gcc dot gnu.org
2012-12-13 15:14 ` Joost.VandeVondele at mat dot ethz.ch
2013-01-15 19:54 ` rsandifo at gcc dot gnu.org
2013-03-22 14:45 ` [Bug fortran/45586] [4.8/4.9 " jakub at gcc dot gnu.org
2013-03-24  8:04 ` Joost.VandeVondele at mat dot ethz.ch
2013-05-31 10:59 ` jakub at gcc dot gnu.org
2013-08-29 13:35 ` Joost.VandeVondele at mat dot ethz.ch
2013-10-16  9:49 ` jakub at gcc dot gnu.org
2013-11-21 18:31 ` Joost.VandeVondele at mat dot ethz.ch
2013-12-30  8:42 ` nheghathivhistha at gmail dot com
2014-01-09 11:52 ` rguenth at gcc dot gnu.org
2014-01-09 14:44 ` [Bug fortran/45586] [4.8 " rguenth at gcc dot gnu.org
2014-02-08 12:47 ` pault at gcc dot gnu.org
2014-02-09 12:57 ` rguenther at suse dot de
2014-02-16  7:00 ` Joost.VandeVondele at mat dot ethz.ch

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=bug-45586-4-h11qvv4ICh@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).