re PR fortran/43996 (ICE in gfc_conv_array_initializer due to incomplete simplificati...
authorSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 18 Nov 2015 22:51:39 +0000 (22:51 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 18 Nov 2015 22:51:39 +0000 (22:51 +0000)
2015-11-18  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/43996
* simplify.c (gfc_simplify_spread): Issue error for too large array
constructor in a PARAMETER statement.

2015-11-18  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/43996
* gfortran.dg/pr43996.f90: New test.

From-SVN: r230579

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr43996.f90 [new file with mode: 0644]

index 34bc058c3eefb1da9db8fcf9ba10515574fa8604..5e10387b8a03f6dd512d032d34116e0f8685ecd0 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-18  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/43996
+       * simplify.c (gfc_simplify_spread): Issue error for too large array 
+       constructor in a PARAMETER statement.
+
 2015-11-17  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        * primary.c (gfc_match_structure_constructor): Fix whitespace.
index 9b58b994d52d99f622c2a4322b959588e05a28e5..4df3fe6c5b52c18ff5e995dfdf3f0d84c5e838ea 100644 (file)
@@ -5991,8 +5991,8 @@ gfc_simplify_spacing (gfc_expr *x)
 gfc_expr *
 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
 {
-  gfc_expr *result = 0L;
-  int i, j, dim, ncopies;
+  gfc_expr *result = NULL;
+  int nelem, i, j, dim, ncopies;
   mpz_t size;
 
   if ((!gfc_is_constant_expr (source)
@@ -6019,8 +6019,20 @@ gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_exp
   else
     mpz_init_set_ui (size, 1);
 
-  if (mpz_get_si (size)*ncopies > flag_max_array_constructor)
-    return NULL;
+  nelem = mpz_get_si (size) * ncopies;
+  if (nelem > flag_max_array_constructor)
+    {
+      if (gfc_current_ns->sym_root->n.sym->attr.flavor == FL_PARAMETER)
+       {
+         gfc_error ("The number of elements (%d) in the array constructor "
+                    "at %L requires an increase of the allowed %d upper "
+                    "limit.  See %<-fmax-array-constructor%> option.",
+                    nelem, &source->where, flag_max_array_constructor);
+         return &gfc_bad_expr;
+       }
+      else
+       return NULL;
+    }
 
   if (source->expr_type == EXPR_CONSTANT)
     {
index 3ac9cb864739b23696058c8892b699972d1aef51..b820e136246ab58e4ad073b01b02535b5979a8d3 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-18  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/43996
+       * gfortran.dg/pr43996.f90: New test.
+
 2015-11-18  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/65083
diff --git a/gcc/testsuite/gfortran.dg/pr43996.f90 b/gcc/testsuite/gfortran.dg/pr43996.f90
new file mode 100644 (file)
index 0000000..d0a4daf
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+! PR fortran/43996
+!
+real, parameter :: a(720,360) = spread((/(j, j=1,720) /), dim=2, ncopies=360) ! { dg-error "number of elements" }
+real x
+x = a(720,360)
+end