OSDN Git Service

2008-11-01 Steven G. Kargl <kargls@comcast.net>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 Nov 2008 16:42:31 +0000 (16:42 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 Nov 2008 16:42:31 +0000 (16:42 +0000)
PR fortran/19925
* trans-array.c (gfc_trans_array_constructor_value): Fix comment.
(gfc_conv_array_initializer): Convert internal_error() to gfc_error_now.
* array.c: Remove GFC_MAX_AC_EXPAND macro.
(gfc_expand_constructor): Use gfc_option.flag_max_array_constructor.
* gfortran.h (gfc_option): Add flag_max_array_constructor member.
* lang.opt: Add -fmax-array-constructor option.
* expr.c (gfc_match_init_expr): Fix error message to mention new option.
* invoke.texi: Document new option.
* options.c (gfc_init_options): Set default value for new option.
(gfc_handle_option): Deal with commandline.

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

gcc/fortran/ChangeLog
gcc/fortran/array.c
gcc/fortran/gfortran.h
gcc/fortran/invoke.texi
gcc/fortran/lang.opt
gcc/fortran/options.c
gcc/fortran/trans-array.c

index a7baab2..574ddc8 100644 (file)
@@ -1,3 +1,17 @@
+2008-11-01  Steven G. Kargl  <kargls@comcast.net>
+
+       PR fortran/19925
+       * trans-array.c (gfc_trans_array_constructor_value): Fix comment.
+       (gfc_conv_array_initializer): Convert internal_error() to gfc_error_now.
+       * array.c: Remove GFC_MAX_AC_EXPAND macro.
+       (gfc_expand_constructor): Use gfc_option.flag_max_array_constructor.
+       * gfortran.h (gfc_option): Add flag_max_array_constructor member.
+       * lang.opt: Add -fmax-array-constructor option.
+       * expr.c (gfc_match_init_expr): Fix error message to mention new option.
+       * invoke.texi: Document new option.
+       * options.c (gfc_init_options): Set default value for new option.
+       (gfc_handle_option): Deal with commandline.
+
 2008-11-01  Daniel Kraft  <d@domob.eu>
 
        PR fortran/35681
@@ -72,7 +86,7 @@
        * fortran/arith.h: Update mpfr_to_mpz prototype.
        * fortran/simplify.c (gfc_simplify_ceiling, gfc_simplify_floor,
        gfc_simplify_ifix, gfc_simplify_idint, simplify_nint): Update function
-       calls to include locus
+       calls to include locus.
 
 2008-10-30  Mikael Morin  <mikael.morin@tele2.fr>
 
index 70cf662..fe83ec6 100644 (file)
@@ -24,13 +24,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "gfortran.h"
 #include "match.h"
 
-/* This parameter is the size of the largest array constructor that we
-   will expand to an array constructor without iterators.
-   Constructors larger than this will remain in the iterator form.  */
-
-#define GFC_MAX_AC_EXPAND 65535
-
-
 /**************** Array reference matching subroutines *****************/
 
 /* Copy an array reference structure.  */
@@ -1463,7 +1456,7 @@ gfc_expand_constructor (gfc_expr *e)
   gfc_expr *f;
   gfc_try rc;
 
-  f = gfc_get_array_element (e, GFC_MAX_AC_EXPAND);
+  f = gfc_get_array_element (e, gfc_option.flag_max_array_constructor);
   if (f != NULL)
     {
       gfc_free_expr (f);
index 5f4880e..9ac6f3c 100644 (file)
@@ -1992,6 +1992,7 @@ typedef struct
   int flag_second_underscore;
   int flag_implicit_none;
   int flag_max_stack_var_size;
+  int flag_max_array_constructor;
   int flag_range_check;
   int flag_pack_derived;
   int flag_repack_arrays;
index 2f6f4b0..8e47df4 100644 (file)
@@ -148,7 +148,8 @@ and warnings}.
 
 @item Directory Options
 @xref{Directory Options,,Options for directory search}.
-@gccoptlist{-I@var{dir}  -J@var{dir}  -M@var{dir}  -fintrinsic-modules-path @var{dir}}
+@gccoptlist{-I@var{dir}  -J@var{dir}  -M@var{dir}  @gol
+-fintrinsic-modules-path @var{dir}}
 
 @item Link Options
 @xref{Link Options,,Options for influencing the linking step}.
@@ -162,9 +163,10 @@ and warnings}.
 
 @item Code Generation Options
 @xref{Code Gen Options,,Options for code generation conventions}.
-@gccoptlist{-fno-automatic  -ff2c  -fno-underscoring
+@gccoptlist{-fno-automatic  -ff2c  -fno-underscoring @gol
 -fsecond-underscore @gol
--fbounds-check -fcheck-array-temporaries  -fmax-stack-var-size=@var{n} @gol
+-fbounds-check -fcheck-array-temporaries  -fmax-array-constructor =@var{n} @gol
+-fmax-stack-var-size=@var{n} @gol
 -fpack-derived  -frepack-arrays  -fshort-enums  -fexternal-blas @gol
 -fblas-matmul-limit=@var{n} -frecursive -finit-local-zero @gol
 -finit-integer=@var{n} -finit-real=@var{<zero|inf|-inf|nan>} @gol
@@ -1191,6 +1193,28 @@ sometimes useful in optimization, in order to avoid such temporaries.
 Note: The warning is only printed once per location.
 
 
+@item -fmax-array-constructor=@var{n}
+@opindex @code{fmax-array-constructor}
+This option can be used to increase the upper limit permitted in 
+array constructors.  The code below requires this option to expand
+the array at compile time.
+
+@smallexample
+@code{program test}
+@code{implicit none}
+@code{integer j}
+@code{integer, parameter :: n = 100000}
+@code{integer, parameter :: i(n) = (/ (2*j, j = 1, n) /)}
+@code{print '(10(I0,1X))', i}
+@code{end program test}
+@end smallexample
+
+@emph{Caution:  This option can lead to long compile times and excessively
+large object files.}
+
+The default value for @var{n} is 65535.
+
+
 @item -fmax-stack-var-size=@var{n}
 @opindex @code{fmax-stack-var-size}
 This option specifies the size in bytes of the largest array that will be put
index 49055f3..04682c1 100644 (file)
@@ -284,6 +284,10 @@ finit-real=
 Fortran RejectNegative Joined
 -finit-real=<zero|nan|inf|-inf> Initialize local real variables
 
+fmax-array-constructor=
+Fortran RejectNegative Joined UInteger
+-fmax-array-constructor=<n>        Maximum number of objects in an array constructor
+
 fmax-errors=
 Fortran RejectNegative Joined UInteger
 -fmax-errors=<n>       Maximum number of errors to report
index e84b3b1..3f49d56 100644 (file)
@@ -65,6 +65,7 @@ gfc_init_options (unsigned int argc, const char **argv)
   gfc_option.max_continue_free = 255;
   gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
   gfc_option.max_subrecord_length = 0;
+  gfc_option.flag_max_array_constructor = 65535;
   gfc_option.convert = GFC_CONVERT_NATIVE;
   gfc_option.record_marker = 0;
   gfc_option.dump_parse_tree = 0;
@@ -642,6 +643,10 @@ gfc_handle_option (size_t scode, const char *arg, int value)
       gfc_add_intrinsic_modules_path (arg);
       break;
 
+    case OPT_fmax_array_constructor_:
+      gfc_option.flag_max_array_constructor = value > 65535 ? value : 65535;
+      break;
+
     case OPT_fmax_errors_:
       gfc_option.max_errors = value;
       break;
index db43a40..218c401 100644 (file)
@@ -1303,7 +1303,7 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
             }
        }
 
-      /* The frontend should already have done any expansions possible
+      /* The frontend should already have done any expansions
         at compile-time.  */
       if (!c->iterator)
        {
@@ -3946,10 +3946,13 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr)
           if (c->iterator)
             {
               /* Problems occur when we get something like
-                 integer :: a(lots) = (/(i, i=1,lots)/)  */
-              /* TODO: Unexpanded array initializers.  */
-              internal_error
-                ("Possible frontend bug: array constructor not expanded");
+                 integer :: a(lots) = (/(i, i=1, lots)/)  */
+              gfc_error_now ("The number of elements in the array constructor "
+                            "at %L requires an increase of the allowed %d "
+                            "upper limit.   See -fmax-array-constructor "
+                            "option", &expr->where,
+                            gfc_option.flag_max_array_constructor);
+             return NULL_TREE;
            }
           if (mpz_cmp_si (c->n.offset, 0) != 0)
             index = gfc_conv_mpz_to_tree (c->n.offset, gfc_index_integer_kind);