This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch, fortran, pr67451, v1] [5/6 Regression] ICE with sourced allocation from coarray
- From: Andre Vehreschild <vehre at gmx dot de>
- To: Paul Richard Thomas <paul dot richard dot thomas at gmail dot com>
- Cc: GCC-Patches-ML <gcc-patches at gcc dot gnu dot org>, GCC-Fortran-ML <fortran at gcc dot gnu dot org>
- Date: Tue, 23 Feb 2016 11:30:16 +0100
- Subject: Re: [Patch, fortran, pr67451, v1] [5/6 Regression] ICE with sourced allocation from coarray
- Authentication-results: sourceware.org; auth=none
- References: <20160129191724 dot 2eb47e1b at vepi2> <CAGkQGiJoXZZXQbr8C_4DhjRXryjFLosNGmMo2GXe3eHwyPk_tw at mail dot gmail dot com> <20160210122624 dot 2114b57d at vepi2> <CAGkQGi+QapaPeCTniZNbzUKV6Fnjua7MzY6yUgF1BSNOQhbnMw at mail dot gmail dot com>
Hi Paul,
thanks for the review. Committed as r233625.
Regards,
Andre
On Wed, 17 Feb 2016 14:13:48 +0100
Paul Richard Thomas <paul.richard.thomas@gmail.com> wrote:
> Dear Andre,
>
> I had left this to somebody else, since I am travelling!
>
> The patch is verging on 'obvious' and so it is OK for trunk.
>
> Could you check the line terminators please? I am seeing CR-LFs but
> this might be an effect of transmission.
>
> Thanks for the patch.
>
> Paul
>
> On 10 February 2016 at 12:26, Andre Vehreschild <vehre@gmx.de> wrote:
> > Hi all,
> >
> > unfortunately was my last patch for pr67451 not perfect and introduced
> > regressions occurring on s390(x) and with the sanitizer. These were
> > caused, because when taking the array specs from the source=-expression
> > also its attributes, like coarray state and so on where taken from
> > there. This additionally added a corank to local objects to allocate,
> > that were no coarrays overwriting data in the array handle. The attached
> > patch fixes both issues.
> >
> > The patch for gcc-5 is not affected, because in gcc-5 the feature of
> > taking the array spec from the source=-expression is not implemented.
> >
> > Bootstrapped and regtested ok on x86_64-linux-gnu/F23.
> >
> > Ok for trunk?
> >
> > Regards,
> > Andre
> >
> > On Tue, 2 Feb 2016 19:24:46 +0100
> > Paul Richard Thomas <paul.richard.thomas@gmail.com> wrote:
> >
> >> Hi Andre,
> >>
> >> This looks to be OK for trunk.
> >>
> >> I'll move to the 5-branch patch right away.
> >>
> >> Thanks
> >>
> >> Paul
> >>
> >> On 29 January 2016 at 19:17, Andre Vehreschild <vehre@gmx.de> wrote:
> >> > Hi all,
> >> >
> >> > attached is a patch to fix a regression in current gfortran when a
> >> > coarray is used in the source=-expression of an allocate(). The ICE was
> >> > caused by the class information, i.e., _vptr and so on, not at the
> >> > expected place. The patch fixes this.
> >> >
> >> > The patch also fixes pr69418, which I will flag as a duplicate in a
> >> > second.
> >> >
> >> > Bootstrapped and regtested ok on x86_64-linux-gnu/F23.
> >> >
> >> > Ok for trunk?
> >> >
> >> > Backport to gcc-5 is pending, albeit more difficult, because the
> >> > allocate() implementation on 5 is not as advanced the one in 6.
> >> >
> >> > Regards,
> >> > Andre
> >> > --
> >> > Andre Vehreschild * Email: vehre ad gmx dot de
> >>
> >>
> >>
> >
> >
> > --
> > Andre Vehreschild * Email: vehre ad gmx dot de
>
>
>
--
Andre Vehreschild * Email: vehre ad gmx dot de
Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog (Revision 233624)
+++ gcc/fortran/ChangeLog (Arbeitskopie)
@@ -1,3 +1,9 @@
+2016-02-23 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ PR fortran/67451
+ * trans-array.c (gfc_array_allocate): Take the attributes from the
+ expression to allocate and not from the source=-expression.
+
2016-02-20 Paul Thomas <pault@gcc.gnu.org>
PR fortran/69423
Index: gcc/fortran/trans-array.c
===================================================================
--- gcc/fortran/trans-array.c (Revision 233624)
+++ gcc/fortran/trans-array.c (Arbeitskopie)
@@ -5401,17 +5401,8 @@
if (!retrieve_last_ref (&ref, &prev_ref))
return false;
- if (ref->u.ar.type == AR_FULL && expr3 != NULL)
- {
- /* F08:C633: Array shape from expr3. */
- ref = expr3->ref;
-
- /* Find the last reference in the chain. */
- if (!retrieve_last_ref (&ref, &prev_ref))
- return false;
- alloc_w_e3_arr_spec = true;
- }
-
+ /* Take the allocatable and coarray properties solely from the expr-ref's
+ attributes and not from source=-expression. */
if (!prev_ref)
{
allocatable = expr->symtree->n.sym->attr.allocatable;
@@ -5428,6 +5419,17 @@
if (!dimension)
gcc_assert (coarray);
+ if (ref->u.ar.type == AR_FULL && expr3 != NULL)
+ {
+ /* F08:C633: Array shape from expr3. */
+ ref = expr3->ref;
+
+ /* Find the last reference in the chain. */
+ if (!retrieve_last_ref (&ref, &prev_ref))
+ return false;
+ alloc_w_e3_arr_spec = true;
+ }
+
/* Figure out the size of the array. */
switch (ref->u.ar.type)
{
@@ -5463,7 +5465,8 @@
gfc_init_block (&set_descriptor_block);
size = gfc_array_init_size (se->expr, alloc_w_e3_arr_spec ? expr->rank
: ref->u.ar.as->rank,
- ref->u.ar.as->corank, &offset, lower, upper,
+ coarray ? ref->u.ar.as->corank : 0,
+ &offset, lower, upper,
&se->pre, &set_descriptor_block, &overflow,
expr3_elem_size, nelems, expr3, e3_arr_desc,
e3_is_array_constr, expr);
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog (Revision 233624)
+++ gcc/testsuite/ChangeLog (Arbeitskopie)
@@ -1,3 +1,8 @@
+2016-02-23 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ PR fortran/67451
+ * gfortran.dg/coarray_allocate_5.f08: New test.
+
2016-02-23 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* gcc.target/s390/vcond-shift.c: Move to ...
Index: gcc/testsuite/gfortran.dg/coarray_allocate_5.f08
===================================================================
--- gcc/testsuite/gfortran.dg/coarray_allocate_5.f08 (nicht existent)
+++ gcc/testsuite/gfortran.dg/coarray_allocate_5.f08 (Arbeitskopie)
@@ -0,0 +1,32 @@
+! { dg-do run }
+! { dg-options "-fcoarray=lib -lcaf_single -fdump-tree-original" }
+!
+! Contributed by Ian Harvey <ian_harvey@bigpond.com>
+! Extended by Andre Vehreschild <vehre@gcc.gnu.org>
+! to test that coarray references in allocate work now
+! PR fortran/67451
+
+ program main
+ implicit none
+ type foo
+ integer :: bar = 99
+ end type
+ class(foo), dimension(:), allocatable :: foobar[:]
+ class(foo), dimension(:), allocatable :: some_local_object
+ allocate(foobar(10)[*])
+
+ allocate(some_local_object, source=foobar)
+
+ if (.not. allocated(foobar)) call abort()
+ if (lbound(foobar, 1) /= 1 .OR. ubound(foobar, 1) /= 10) call abort()
+ if (.not. allocated(some_local_object)) call abort()
+ if (any(some_local_object(:)%bar /= [99, 99, 99, 99, 99, 99, 99, 99, 99, 99])) call abort()
+
+ deallocate(some_local_object)
+ deallocate(foobar)
+ end program
+
+! Check that some_local_object is treated as rank-1 array.
+! This failed beforehand, because the coarray attribute of the source=expression
+! was propagated to some_local_object in the allocate.
+! { dg-final { scan-tree-dump-not "some_local_object\._data\.dim\[1\]\.lbound" "original" } }