OSDN Git Service

2010-12-11 Mikael Morin <mikael@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Dec 2010 20:05:20 +0000 (20:05 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Dec 2010 20:05:20 +0000 (20:05 +0000)
    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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167713 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c

index b2ddec0..03068e0 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2010-12-10  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/46540
index 4c0bdfc..d8c37a5 100644 (file)
@@ -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;