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

Reply via email to