diff options
author | Tobias Burnus <burnus@net-b.de> | 2012-06-18 20:31:54 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2012-06-18 20:31:54 +0200 |
commit | 478ad83d94c54c0e8e939336fcfbbfb85529a6d9 (patch) | |
tree | 3fd75f61b5e57a6a5cac11296c0f7173d323cd01 /gcc/fortran | |
parent | c1fb34c3ae740ed96d771e3f2b009e3bf3278242 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 1 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 16 |
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; |