aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2020-11-24 21:51:17 +0100
committerThomas Koenig <tkoenig@gcc.gnu.org>2020-11-24 21:51:17 +0100
commitb95fc78fc7362b3e5cbe148e2df9f8cf2e82548c (patch)
treee3e089bf1bb14bf28f93b2d91b0f1b168fcb14a2 /gcc
parente7ce178f52d38c2117dd1501442c367afa000523 (diff)
downloadgcc-b95fc78fc7362b3e5cbe148e2df9f8cf2e82548c.zip
gcc-b95fc78fc7362b3e5cbe148e2df9f8cf2e82548c.tar.gz
gcc-b95fc78fc7362b3e5cbe148e2df9f8cf2e82548c.tar.bz2
Fix coarrays in namelist.
gcc/fortran/ChangeLog: * trans-array.c (cas_array_ref): Correct assert. * trans-io.c (cas_nml_addr_expr): New function. (transfer_namelist_element): Call when needed.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/trans-array.c2
-rw-r--r--gcc/fortran/trans-io.c40
2 files changed, 40 insertions, 2 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 0baea88..1a75bb5 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -3015,7 +3015,7 @@ cas_add_this_image_offset (tree offset, tree desc, gfc_array_ref *ar,
static gfc_ref *
cas_array_ref (gfc_ref *ref)
{
- gcc_assert (flag_coarray = GFC_FCOARRAY_SHARED);
+ gcc_assert (flag_coarray == GFC_FCOARRAY_SHARED);
for (; ref; ref = ref->next)
{
diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c
index 666dc37..244f2c8 100644
--- a/gcc/fortran/trans-io.c
+++ b/gcc/fortran/trans-io.c
@@ -1636,6 +1636,41 @@ nml_get_addr_expr (gfc_symbol * sym, gfc_component * c,
return tmp;
}
+/* Add the address expression of a shared coarray. It is easiest to
+ use gfc_conv_expr which already does the right thing in this
+ case. */
+
+static tree
+cas_nml_addr_expr (gfc_symbol *sym)
+{
+ gfc_se se;
+ gfc_expr *e = gfc_lval_expr_from_sym (sym);
+ int rank, corank;
+
+ e->ref = gfc_get_ref ();
+ e->ref->type = REF_ARRAY;
+ e->ref->u.ar.type = AR_ELEMENT;
+ rank = sym->as->rank;
+ corank = sym->as->corank;
+ e->ref->u.ar.dimen = rank;
+ e->ref->u.ar.codimen = corank;
+ e->ref->u.ar.as = sym->as;
+ e->ts = sym->ts;
+ for (int i = 0; i < rank; i++)
+ {
+ e->ref->u.ar.dimen_type[i] = DIMEN_ELEMENT;
+ e->ref->u.ar.start[i] = gfc_copy_expr (sym->as->lower[i]);
+ }
+
+ for (int i = rank; i < rank + corank; i++)
+ e->ref->u.ar.dimen_type[i] = DIMEN_THIS_IMAGE;
+
+ gfc_init_se (&se, NULL);
+ se.want_pointer = 1;
+ gfc_conv_expr (&se, e);
+ gfc_free_expr (e);
+ return se.expr;
+}
/* For an object VAR_NAME whose base address is BASE_ADDR, generate a
call to iocall[IOCALL_SET_NML_VAL]. For derived type variable, recursively
@@ -1679,7 +1714,10 @@ transfer_namelist_element (stmtblock_t * block, const char * var_name,
else
as = sym ? CLASS_DATA (sym)->as : CLASS_DATA (c)->as;
- addr_expr = nml_get_addr_expr (sym, c, base_addr);
+ if (flag_coarray == GFC_FCOARRAY_SHARED && sym->attr.codimension)
+ addr_expr = cas_nml_addr_expr (sym);
+ else
+ addr_expr = nml_get_addr_expr (sym, c, base_addr);
if (as)
rank = as->rank;