On Fri, Feb 29, 2008 at 1:01 PM, FX <[EMAIL PROTECTED]> wrote: > Hi all, > > I'm going forward on my patch to remove the multiple decls emitted by > the Fortran front-end for a single function. The problem is that doing > so yields quite a few type mismatch issues that were hidden by it. > Some of them can be corrected in the front-end, and for some of them I > just don't know. Today's example is an error when we try to > fold_convert() a RECORD_TYPE into a different, but similar > RECORD_TYPE. Namely, the right hand side is: > > (gdb) p debug_tree(rse->expr) > <call_expr 0x2b87100be870 > type <record_type 0x2b8710158000 t SI > size <integer_cst 0x2b87100baa50 constant invariant 32> > unit size <integer_cst 0x2b87100ba6c0 constant invariant 4> > align 32 symtab 0 alias set -1 canonical type 0x2b8710158000 > fields <field_decl 0x2b8710153aa0 i type <integer_type > 0x2b87100c7540 integer(kind=4)> > SI file a2.f90 line 3 col 0 size <integer_cst > 0x2b87100baa50 32> unit size <integer_cst 0x2b87100ba6c0 4> > align 32 offset_align 128 > offset <integer_cst 0x2b87100ba6f0 constant invariant 0> > bit offset <integer_cst 0x2b87100baf30 constant invariant > 0> context <record_type 0x2b8710158000 t>> > chain <type_decl 0x2b87101580c0 D.901>> > [...] > > and the left hand side is: > > (gdb) p debug_tree(lse->expr) > <var_decl 0x2b8710153f00 res > type <record_type 0x2b8710158480 t SI > size <integer_cst 0x2b87100baa50 constant invariant 32> > unit size <integer_cst 0x2b87100ba6c0 constant invariant 4> > align 32 symtab 0 alias set -1 canonical type 0x2b8710158480 > fields <field_decl 0x2b8710153e60 i type <integer_type > 0x2b87100c7540 integer(kind=4)> > SI file a2.f90 line 11 col 0 size <integer_cst > 0x2b87100baa50 32> unit size <integer_cst 0x2b87100ba6c0 4> > align 32 offset_align 128 > offset <integer_cst 0x2b87100ba6f0 constant invariant 0> > bit offset <integer_cst 0x2b87100baf30 constant invariant > 0> context <record_type 0x2b8710158480 t>> > chain <type_decl 0x2b8710158540 D.907>> > [...] > > The two record types are equivalent in Fortran rules: in Fortran, you > can assign between two different type (defined in different places, or > with different names) as long as they have the same list of > components, in the same order, with the same attributes. However, the > middle-end doesn't like that, and fold_convert'ing rse->expr into a > TREE_TYPE(lse->expr) yields to failure. My questions are: > > 1. Is this limitation in the middle-end likely to be lifted if we > ask nicely? I mean, if I understand correctly, the current behaviour > is implemented here because it's the right thing to do to support C, > but GCC is more than C, so maybe it could be considered to change this > assumption? Or would that be more work than I imagine?
Sort of. The frontend is supposed to note this compatibility via the TYPE_MAIN_VARIANT or the TYPE_CANONICAL mechanism (note that fold_convert doesn't listen to TYPE_CANONICAL at all at the moment, but this eventually needs to change anyway). > 2. Could a Fortran maintainer who knows copy_dt_decls_ifequal() > advise me on how likely it is that we can resolve this directly in the > front-end? For example, I imagine we could, before building a new type > node, go through all the other derived types nodes and see if there's > one that fits... but is that a reasonable thing to do? Or would it > break other stuff that I don't think off? Another workaround is to use a VIEW_CONVERT_EXPR in case fold_convertible_p () returns false but you still think you are ok. Richard.