aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMikael Morin <mikael.morin@sfr.fr>2011-10-07 21:52:34 +0200
committerMikael Morin <mikael@gcc.gnu.org>2011-10-07 19:52:34 +0000
commit9b701a45c047674f32a5bbd2dc4a42ad7fd95c80 (patch)
tree30faf6bf43e93edda58000335ce95e2034e90101 /gcc
parent6bd0ce7b615b8ac7ccdc63458b558765847e7da9 (diff)
downloadgcc-9b701a45c047674f32a5bbd2dc4a42ad7fd95c80.zip
gcc-9b701a45c047674f32a5bbd2dc4a42ad7fd95c80.tar.gz
gcc-9b701a45c047674f32a5bbd2dc4a42ad7fd95c80.tar.bz2
trans-intrinsic.c (walk_coarray): New function.
* trans-intrinsic.c (walk_coarray): New function. (convert_element_to_coarray_ref): Move code to walk_coarray. Remove. (trans-this_image, trans_image_index, conv_intrinsic_cobound): Use walk_coarray. From-SVN: r179684
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-intrinsic.c46
2 files changed, 34 insertions, 19 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 8bcaf58..e7a9941 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@
2011-10-07 Mikael Morin <mikael.morin@sfr.fr>
+ * trans-intrinsic.c (walk_coarray): New function.
+ (convert_element_to_coarray_ref): Move code to walk_coarray. Remove.
+ (trans-this_image, trans_image_index, conv_intrinsic_cobound):
+ Use walk_coarray.
+
+2011-10-07 Mikael Morin <mikael.morin@sfr.fr>
+
* trans-array.c (gfc_conv_expr_descriptor): Add out-of-the-scalarizer
cobounds evaluation.
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index c216873..bc21b02 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -924,18 +924,32 @@ gfc_conv_intrinsic_exponent (gfc_se *se, gfc_expr *expr)
/* Convert the last ref of a scalar coarray from an AR_ELEMENT to an
AR_FULL, suitable for the scalarizer. */
-static void
-convert_element_to_coarray_ref (gfc_expr *expr)
+static gfc_ss *
+walk_coarray (gfc_expr *e)
{
- gfc_ref *ref;
+ gfc_ss *ss;
- for (ref = expr->ref; ref; ref = ref->next)
- if (ref->type == REF_ARRAY && ref->next == NULL
- && ref->u.ar.codimen)
- {
- ref->u.ar.type = AR_FULL;
- break;
- }
+ gcc_assert (gfc_get_corank (e) > 0);
+
+ ss = gfc_walk_expr (e);
+
+ /* Fix scalar coarray. */
+ if (ss == gfc_ss_terminator)
+ {
+ gfc_ref *ref;
+
+ ss = gfc_get_array_ss (gfc_ss_terminator, e, 0, GFC_SS_SECTION);
+
+ ref = e->ref;
+ while (ref->next)
+ ref = ref->next;
+
+ gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);
+ ref->u.ar.type = AR_FULL;
+ ss->data.info.ref = ref;
+ }
+
+ return ss;
}
@@ -969,9 +983,7 @@ trans_this_image (gfc_se * se, gfc_expr *expr)
/* Obtain the descriptor of the COARRAY. */
gfc_init_se (&argse, NULL);
- if (expr->value.function.actual->expr->rank == 0)
- convert_element_to_coarray_ref (expr->value.function.actual->expr);
- ss = gfc_walk_expr (expr->value.function.actual->expr);
+ ss = walk_coarray (expr->value.function.actual->expr);
gcc_assert (ss != gfc_ss_terminator);
ss->data.info.codimen = corank;
argse.want_coarray = 1;
@@ -1157,9 +1169,7 @@ trans_image_index (gfc_se * se, gfc_expr *expr)
/* Obtain the descriptor of the COARRAY. */
gfc_init_se (&argse, NULL);
- if (expr->value.function.actual->expr->rank == 0)
- convert_element_to_coarray_ref (expr->value.function.actual->expr);
- ss = gfc_walk_expr (expr->value.function.actual->expr);
+ ss = walk_coarray (expr->value.function.actual->expr);
gcc_assert (ss != gfc_ss_terminator);
ss->data.info.codimen = corank;
argse.want_coarray = 1;
@@ -1484,9 +1494,7 @@ conv_intrinsic_cobound (gfc_se * se, gfc_expr * expr)
gcc_assert (arg->expr->expr_type == EXPR_VARIABLE);
corank = gfc_get_corank (arg->expr);
- if (expr->value.function.actual->expr->rank == 0)
- convert_element_to_coarray_ref (expr->value.function.actual->expr);
- ss = gfc_walk_expr (arg->expr);
+ ss = walk_coarray (arg->expr);
gcc_assert (ss != gfc_ss_terminator);
ss->data.info.codimen = corank;
gfc_init_se (&argse, NULL);