aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Vehreschild <vehre@gcc.gnu.org>2016-02-23 11:29:26 +0100
committerAndre Vehreschild <vehre@gcc.gnu.org>2016-02-23 11:29:26 +0100
commite457a6fc36cc3d4241c83ad4f74a6ed903376982 (patch)
tree32dbc9ce729b00746995438b95c3c519e3e73efe
parentd7b574f4d2d1162db60fbeedbc908a2e7a9c6b14 (diff)
downloadgcc-e457a6fc36cc3d4241c83ad4f74a6ed903376982.zip
gcc-e457a6fc36cc3d4241c83ad4f74a6ed903376982.tar.gz
gcc-e457a6fc36cc3d4241c83ad4f74a6ed903376982.tar.bz2
re PR fortran/67451 ([F08] ICE with sourced allocation from coarray.)
gcc/testsuite/ChangeLog: 2016-02-23 Andre Vehreschild <vehre@gcc.gnu.org> PR fortran/67451 * gfortran.dg/coarray_allocate_5.f08: New test. gcc/fortran/ChangeLog: 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. From-SVN: r233625
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-array.c27
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_allocate_5.f0832
4 files changed, 58 insertions, 12 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 99d1366..7e0b882 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 2ff2833..649b80f 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -5401,17 +5401,8 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
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 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
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_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1eacf12..7d23225 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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 ...
diff --git a/gcc/testsuite/gfortran.dg/coarray_allocate_5.f08 b/gcc/testsuite/gfortran.dg/coarray_allocate_5.f08
new file mode 100644
index 0000000..feb1bf3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_allocate_5.f08
@@ -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" } }