From 699bc9475cfcf025f6753eee55222152d83a16c7 Mon Sep 17 00:00:00 2001 From: jvdelisle Date: Sat, 11 Dec 2010 20:05:20 +0000 Subject: [PATCH] 2010-12-11 Mikael Morin Jerry DeLisle 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167713 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/trans-array.c | 22 ++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b2ddec020c7..03068e0c6a0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2010-12-11 Mikael Morin + Jerry DeLisle + + 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. + 2010-12-10 Tobias Burnus PR fortran/46540 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 4c0bdfcd184..d8c37a52d07 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; -- 2.11.0