aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2012-06-18 20:31:54 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2012-06-18 20:31:54 +0200
commit478ad83d94c54c0e8e939336fcfbbfb85529a6d9 (patch)
tree3fd75f61b5e57a6a5cac11296c0f7173d323cd01 /gcc/fortran
parentc1fb34c3ae740ed96d771e3f2b009e3bf3278242 (diff)
downloadgcc-478ad83d94c54c0e8e939336fcfbbfb85529a6d9.zip
gcc-478ad83d94c54c0e8e939336fcfbbfb85529a6d9.tar.gz
gcc-478ad83d94c54c0e8e939336fcfbbfb85529a6d9.tar.bz2
re PR fortran/53692 (OPTIONAL: Scalarizing over the wrong array)
2012-06-18 Tobias Burnus <burnus@net-b.de> PR fortran/53692 * trans-array.c (set_loop_bounds): Don't scalarize via absent optional arrays. * resolve.c (resolve_elemental_actual): Don't stop resolving after printing a warning. 2012-06-18 Tobias Burnus <burnus@net-b.de> PR fortran/53692 * gfortran.dg/elemental_optional_args_6.f90: New. From-SVN: r188749
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/resolve.c1
-rw-r--r--gcc/fortran/trans-array.c16
3 files changed, 23 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 8be7142..a89e197 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,13 @@
2012-06-18 Tobias Burnus <burnus@net-b.de>
+ PR fortran/53692
+ * trans-array.c (set_loop_bounds): Don't scalarize via absent
+ optional arrays.
+ * resolve.c (resolve_elemental_actual): Don't stop resolving after printing
+ a warning.
+
+2012-06-18 Tobias Burnus <burnus@net-b.de>
+
PR fortran/53526
* trans-intrinsic.c (conv_intrinsic_move_alloc): Handle coarrays.
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 8531318..d09cb11 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -1957,7 +1957,6 @@ resolve_elemental_actual (gfc_expr *expr, gfc_code *c)
"ELEMENTAL procedure unless there is a non-optional "
"argument with the same rank (12.4.1.5)",
arg->expr->symtree->n.sym->name, &arg->expr->where);
- return FAILURE;
}
}
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 0e78210..f135af1 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -4337,6 +4337,7 @@ set_loop_bounds (gfc_loopinfo *loop)
bool dynamic[GFC_MAX_DIMENSIONS];
mpz_t *cshape;
mpz_t i;
+ bool nonoptional_arr;
loopspec = loop->specloop;
@@ -4345,6 +4346,18 @@ set_loop_bounds (gfc_loopinfo *loop)
{
loopspec[n] = NULL;
dynamic[n] = false;
+
+ /* If there are both optional and nonoptional array arguments, scalarize
+ over the nonoptional; otherwise, it does not matter as then all
+ (optional) arrays have to be present per F2008, 125.2.12p3(6). */
+
+ nonoptional_arr = false;
+
+ for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain)
+ if (ss->info->type != GFC_SS_SCALAR && ss->info->type != GFC_SS_TEMP
+ && ss->info->type != GFC_SS_REFERENCE && !ss->info->can_be_null_ref)
+ nonoptional_arr = true;
+
/* We use one SS term, and use that to determine the bounds of the
loop for this dimension. We try to pick the simplest term. */
for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain)
@@ -4354,7 +4367,8 @@ set_loop_bounds (gfc_loopinfo *loop)
ss_type = ss->info->type;
if (ss_type == GFC_SS_SCALAR
|| ss_type == GFC_SS_TEMP
- || ss_type == GFC_SS_REFERENCE)
+ || ss_type == GFC_SS_REFERENCE
+ || (ss->info->can_be_null_ref && nonoptional_arr))
continue;
info = &ss->info->data.array;