Prevent aliasing between arguments in calls to move_alloc
Paul Richard Thomas
paul.richard.thomas@gmail.com
Wed Nov 9 10:43:00 GMT 2016
Hi Steve,
Committed as r241995. Thanks.
Paul
On 8 November 2016 at 20:43, Steve Kargl
<sgk@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
>> <sgk@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
More information about the Fortran
mailing list