diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2010-12-11 20:05:20 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2010-12-11 20:05:20 +0000 |
commit | b4e9d41d1a9f94d7245e69f0cc5e34995205aa65 (patch) | |
tree | 900d74eec8da14df49f0761d3dff6b26098f6b82 /gcc/fortran/trans-array.c | |
parent | e97cfd97070b27823e55d717b802c4bc95954104 (diff) | |
download | gcc-b4e9d41d1a9f94d7245e69f0cc5e34995205aa65.zip gcc-b4e9d41d1a9f94d7245e69f0cc5e34995205aa65.tar.gz gcc-b4e9d41d1a9f94d7245e69f0cc5e34995205aa65.tar.bz2 |
re PR fortran/46842 (wrong results with MATMUL(..., TRANSPOSE (func ())) -- 465.tonto test run miscompares)
2010-12-11 Mikael Morin <mikael@gcc.gnu.org>
Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/46842
* trans-array.c (dim_ok): New helper function.
(gfc_conv_expr_descriptor): Use new helper function to check
function array is full.
Co-Authored-By: Jerry DeLisle <jvdelisle@gcc.gnu.org>
From-SVN: r167713
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 4c0bdfc..d8c37a5 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -5293,6 +5293,16 @@ get_array_charlen (gfc_expr *expr, gfc_se *se) } } +/* Helper function to check dimensions. */ +static bool +dim_ok (gfc_ss_info *info) +{ + int n; + for (n = 0; n < info->dimen; n++) + if (info->dim[n] != n) + return false; + return true; +} /* Convert an array for passing as an actual argument. Expressions and vector subscripts are evaluated and stored in a temporary, which is then @@ -5378,15 +5388,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) else full = gfc_full_array_ref_p (info->ref, NULL); - if (full) - for (n = 0; n < info->dimen; n++) - if (info->dim[n] != n) - { - full = 0; - break; - } - - if (full) + if (full && dim_ok (info)) { if (se->direct_byref && !se->byref_noassign) { @@ -5588,7 +5590,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) desc = loop.temp_ss->data.info.descriptor; } - else if (expr->expr_type == EXPR_FUNCTION) + else if (expr->expr_type == EXPR_FUNCTION && dim_ok (info)) { desc = info->descriptor; se->string_length = ss->string_length; |