Hi Paul,

Just one small nit and one idea remaining:

The nit: You've missed one "same_type" at:

> Index: gcc/fortran/trans-array.c
> ===================================================================
> *** gcc/fortran/trans-array.c   (revision 241467)
> --- gcc/fortran/trans-array.c   (working copy)
> *************** structure_alloc_comps (gfc_symbol * der_
> *** 8421,8426 ****
> --- 8510,8516 ----
>               gfc_add_expr_to_block (&fnblock, tmp);
>             }
>           else if (c->attr.allocatable && !c->attr.proc_pointer
> +                  && !(c->ts.type == BT_DERIVED && der_type ==
> c->ts.u.derived) && (!(cmp_has_alloc_comps && c->as)

  ^^^^ here
>                        || c->attr.codimension))
>             {

The idea: One could think about doing the same "same_type" for the chunks in
===================================================================
*** gcc/fortran/trans-types.c   (revision 241467)
--- gcc/fortran/trans-types.c   (working copy)
*************** gfc_get_derived_type (gfc_symbol * deriv

which would eliminate evaluating the same checks thrice.

Besides that ok for trunk.

Thanks for the work.

Regards,
        Andre


On Tue, 25 Oct 2016 13:40:03 +0200
Paul Richard Thomas <paul.richard.tho...@gmail.com> wrote:

> Dear Andre,
> 
> Thanks for the review. Please find my responses below and the revised
> patch attached
> 
> With these changes, OK for trunk?
> 
> With respect to Dominique's testcase posted last night at 23:18, this
> is an issue for the feature which I will raise on clf. It seems to me
> that in the circumstances, a deep copy of the allocatable components
> should be made in the FROM expression in move_alloc but I am not sure.
> I will post a PR about this as well, after the patch is committed.
> 
> Best regards
> 
> Paul
> 
> ....snip....
> 
> >
> > So recursive types are defined to be simple recursive, i.e., not transitive?
> > type A == uses => type B == uses => type A  
> 
> This is caught by:
>       type(linked_list2), allocatable :: link
>                                        1
> Error: Derived type at (1) has not been previously defined and so
> cannot appear in a derived type definition
> andre.f90:10:28:
> 
>    type(linked_list1) :: test
>                             1
> Error: Symbol ‘test’ at (1) cannot have a type
> andre.f90:12:27:
> 
> So, in this implementation anyway, the answer to your question is 'yes'.
> 
> ....snip....
> 
> >> +           if (derived->attr.unlimited_polymorphic
> >> +               || derived->attr.abstract
> >> +               || !rdt)  
> >
> > When unlimited or abstract rdt can never be true. This is redundant here,
> > isn't it?  
> 
> No. Derived types that are not unlimited or abstract might not have
> recursive components.
> 
> ....snip....
> 
> >>         {
> >>           if (!c->attr.pointer && !c->attr.proc_pointer
> >> +          && !(c->attr.allocatable && (der == c->ts.u.derived))  
> >
> > The inner most pair of parentheses is unnecessary here.  
> 
> The parentheses have been removed.
> 
> ....snip....
> 
> > The indentation of the whole block above is wrong. The comment has 6 spaces
> > while it should have 2 only.  
> 
> Corrected. Well spotted.
> 
> ....snip....
> 
> > is_derived_type = c->ts.type == BT_DERIVED && der_type == c->ts.u.derived;
> >
> > and using that instead of repeatedly evaluating the expression?  
> 
> Done. I called it 'same_type'.
> >
> > <snip>
> >  
> >> *************** structure_alloc_comps (gfc_symbol * der_
> >> *** 8137,8142 ****
> >> --- 8141,8222 ----
> >>                                      build_int_cst (TREE_TYPE (comp), 0));
> >>               gfc_add_expr_to_block (&tmpblock, tmp);
> >>             }
> >> +         else if (c->attr.allocatable && !c->attr.codimension)
> >> +           {  
> >
> > How about putting also the creation of the descriptor into the body that is
> > guarded by the is_allocated, i.e. in pseudo-code make:  
> 
> ....snip....
> 
> done
> 
> >
> > Furthermore, why are you always using an array? We do now at code-generation
> > time whether the argument is a scalar or an array, don't we? This is more
> > for my understanding, then an actual comment.  
> 
> This is to limit the number of deallocators to 1 with a rank=1
> argument. This was the simplest solution.
> 
> >  
> >>   /* The size field is returned as an array index type.  Therefore treat
> >> Index: gcc/fortran/trans-types.c
> >> ===================================================================
> >> *** gcc/fortran/trans-types.c (revision 241467)
> >> --- gcc/fortran/trans-types.c (working copy)  
> 
> ....snip....
> 
> >> !               && !(c->attr.allocatable && (derived == c->ts.u.derived))  
> >
> > Spare parentheses above (derived == ..)  
> 
> All removed
> 
> 
> >> Index: gcc/testsuite/gfortran.dg/recursive_alloc_comp_3.f08
> >> ===================================================================
> >> *** gcc/testsuite/gfortran.dg/recursive_alloc_comp_3.f08      (revision 0)
> >> --- gcc/testsuite/gfortran.dg/recursive_alloc_comp_3.f08      (working
> >> copy) ***************  
> 
> ....Snip....
> 
> > This testcase fails only on segfaults, but never on wrong data. Can you
> > enhance it to e.g. make output() check that it is seeing 3.0 on the top
> > before the pop and 2.0 after?  
> 
> 
> Done


-- 
Andre Vehreschild * Email: vehre ad gmx dot de 

Reply via email to