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 {
next prev 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: linkBe 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).