Hi Steve, Committed as r241995. Thanks.
Paul On 8 November 2016 at 20:43, Steve Kargl <s...@troutmask.apl.washington.edu> wrote: > 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 -- The difference between genius and stupidity is; genius has its limits. Albert Einstein