]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/34556 (Rejects valid with bogus error message: parameter initalization)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 18 Jan 2008 02:08:22 +0000 (02:08 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 18 Jan 2008 02:08:22 +0000 (02:08 +0000)
2008-01-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/34556
* simplify.c (is_constant_array_expr): New static function that returns
true if the given expression is an array and is constant.
(gfc_simplify_reshape): Use new function.

From-SVN: r131623

gcc/fortran/ChangeLog
gcc/fortran/simplify.c

index ad0ffcc443ee50acd120f9bfaeedb768ddb977bc..81feb213caa58d5e1ca7a109462cb5bc6f3380b5 100644 (file)
@@ -1,3 +1,10 @@
+2008-01-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/34556
+       * simplify.c (is_constant_array_expr): New static function that returns
+       true if the given expression is an array and is constant.
+       (gfc_simplify_reshape): Use new function.
+
 2008-01-17  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR fortran/33375
index 85d74a5e13a039c09f0c5da3c79528d1cadac5b2..12be1e08222254faeee1cafde0c52be1f6e4c2f4 100644 (file)
@@ -3164,6 +3164,30 @@ gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
 }
 
 
+/* Test that the expression is an constant array.  */
+
+static bool
+is_constant_array_expr (gfc_expr *e)
+{
+  gfc_constructor *c;
+
+  if (e == NULL)
+    return true;
+
+  if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
+    return false;
+  
+  if (e->value.constructor == NULL)
+    return false;
+  
+  for (c = e->value.constructor; c; c = c->next)
+    if (c->expr->expr_type != EXPR_CONSTANT)
+      return false;
+
+  return true;
+}
+
+
 /* This one is a bear, but mainly has to do with shuffling elements.  */
 
 gfc_expr *
@@ -3178,22 +3202,21 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
   size_t nsource;
   gfc_expr *e;
 
-  /* Unpack the shape array.  */
-  if (source->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (source))
+  /* Check that argument expression types are OK.  */
+  if (!is_constant_array_expr (source))
     return NULL;
 
-  if (shape_exp->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (shape_exp))
+  if (!is_constant_array_expr (shape_exp))
     return NULL;
 
-  if (pad != NULL
-      && (pad->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (pad)))
+  if (!is_constant_array_expr (pad))
     return NULL;
 
-  if (order_exp != NULL
-      && (order_exp->expr_type != EXPR_ARRAY
-         || !gfc_is_constant_expr (order_exp)))
+  if (!is_constant_array_expr (order_exp))
     return NULL;
 
+  /* Proceed with simplification, unpacking the array.  */
+
   mpz_init (index);
   rank = 0;
   head = tail = NULL;