Yes.  I saw Ian's analysis in c.l.f.  It seems we both got
caught out on this one.  The patch looks fine.

-- 
steve

On Tue, Nov 08, 2016 at 08:26:37PM +0100, Paul Richard Thomas wrote:
> Hi Steve,
> 
> I moved too quickly and caused a regression. See the link in the
> testcase. The attached fixes the problem and bootstraps/regtests.
> 
> OK for trunk?
> 
> Paul
> 
> 
> On 5 November 2016 at 16:17, Steve Kargl
> <s...@troutmask.apl.washington.edu> wrote:
> > On Sat, Nov 05, 2016 at 10:05:30AM +0100, Paul Richard Thomas wrote:
> >>
> >> Bootstraps and regtests on FC21/x86_64 - OK for trunk?
> >
> > OK with minor nit (see below).
> >
> >>
> >> +   /*  F2003 12.4.1.7  */
> >> +   if (to->expr_type == EXPR_VARIABLE && from->expr_type ==EXPR_VARIABLE
> >
> > Need a space after ==.
> >
> > --
> > Steve
> 
> 
> 
> -- 
> The difference between genius and stupidity is; genius has its limits.
> 
> Albert Einstein

> Index: gcc/fortran/check.c
> ===================================================================
> *** gcc/fortran/check.c       (revision 241872)
> --- gcc/fortran/check.c       (working copy)
> *************** gfc_check_move_alloc (gfc_expr *from, gf
> *** 3343,3355 ****
>       }
>   
>     /*  F2003 12.4.1.7  */
> !   if (to->expr_type == EXPR_VARIABLE && from->expr_type ==EXPR_VARIABLE
>         && !strcmp (to->symtree->n.sym->name, from->symtree->n.sym->name))
>       {
> !       gfc_error ("The FROM and TO arguments at %L are either the same 
> object "
> !              "or subobjects thereof and so violate aliasing restrictions "
> !              "(F2003 12.4.1.7)", &to->where);
> !       return false;
>       }
>   
>     /* CLASS arguments: Make sure the vtab of from is present.  */
> --- 3343,3380 ----
>       }
>   
>     /*  F2003 12.4.1.7  */
> !   if (to->expr_type == EXPR_VARIABLE && from->expr_type == EXPR_VARIABLE
>         && !strcmp (to->symtree->n.sym->name, from->symtree->n.sym->name))
>       {
> !       gfc_ref *to_ref, *from_ref;
> !       to_ref = to->ref;
> !       from_ref = from->ref;
> !       bool aliasing = true;
> ! 
> !       for (; from_ref && to_ref;
> !        from_ref = from_ref->next, to_ref = to_ref->next)
> !     {
> !       if (to_ref->type != from->ref->type)
> !         aliasing = false;
> !       else if (to_ref->type == REF_ARRAY
> !                && to_ref->u.ar.type != AR_FULL
> !                && from_ref->u.ar.type != AR_FULL)
> !         /* Play safe; assume sections and elements are different.  */
> !         aliasing = false;
> !       else if (to_ref->type == REF_COMPONENT
> !                && to_ref->u.c.component != from_ref->u.c.component)
> !         aliasing = false;
> ! 
> !       if (!aliasing)
> !         break;
> !     }
> ! 
> !       if (aliasing)
> !     {
> !       gfc_error ("The FROM and TO arguments at %L violate aliasing "
> !                  "restrictions (F2003 12.4.1.7)", &to->where);
> !       return false;
> !     }
>       }
>   
>     /* CLASS arguments: Make sure the vtab of from is present.  */
> Index: gcc/testsuite/gfortran.dg/move_alloc_18.f90
> ===================================================================
> *** gcc/testsuite/gfortran.dg/move_alloc_18.f90       (revision 0)
> --- gcc/testsuite/gfortran.dg/move_alloc_18.f90       (working copy)
> ***************
> *** 0 ****
> --- 1,21 ----
> + ! { dg-do compile }
> + !
> + ! Test that the anti-aliasing restriction does not knock out valid code.
> + !
> + ! Contributed by  Andrew Balwin on
> + ! https://groups.google.com/forum/#!topic/comp.lang.fortran/oiXdl1LPb_s
> + !
> +       PROGRAM TEST
> +         IMPLICIT NONE
> + 
> +         TYPE FOOBAR
> +           INTEGER, ALLOCATABLE :: COMP(:)
> +         END TYPE
> + 
> +         TYPE (FOOBAR) :: MY_ARRAY(6)
> + 
> +         ALLOCATE (MY_ARRAY(1)%COMP(10))
> + 
> +         CALL MOVE_ALLOC (MY_ARRAY(1)%COMP, MY_ARRAY(2)%COMP)
> + 
> +       END PROGRAM TEST


-- 
Steve

Reply via email to