aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-array.c
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2010-12-11 20:05:20 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2010-12-11 20:05:20 +0000
commitb4e9d41d1a9f94d7245e69f0cc5e34995205aa65 (patch)
tree900d74eec8da14df49f0761d3dff6b26098f6b82 /gcc/fortran/trans-array.c
parente97cfd97070b27823e55d717b802c4bc95954104 (diff)
downloadgcc-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.c22
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;