OSDN Git Service

PR fortran/23677
[pf3gnuchains/gcc-fork.git] / gcc / fortran / options.c
1 /* Parse and display command line options.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
3    Inc.
4    Contributed by Andy Vaught
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tree.h"
28 #include "flags.h"
29 #include "intl.h"
30 #include "opts.h"
31 #include "options.h"
32 #include "tree-inline.h"
33
34 #include "gfortran.h"
35
36 gfc_option_t gfc_option;
37
38
39 /* Get ready for options handling.  */
40
41 unsigned int
42 gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
43                   const char **argv ATTRIBUTE_UNUSED)
44 {
45   gfc_source_file = NULL;
46   gfc_option.module_dir = NULL;
47   gfc_option.source_form = FORM_UNKNOWN;
48   gfc_option.fixed_line_length = 72;
49   gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
50   gfc_option.verbose = 0;
51
52   gfc_option.warn_aliasing = 0;
53   gfc_option.warn_conversion = 0;
54   gfc_option.warn_implicit_interface = 0;
55   gfc_option.warn_line_truncation = 0;
56   gfc_option.warn_underflow = 1;
57   gfc_option.warn_surprising = 0;
58   gfc_option.warn_unused_labels = 0;
59
60   gfc_option.flag_default_double = 0;
61   gfc_option.flag_default_integer = 0;
62   gfc_option.flag_default_real = 0;
63   gfc_option.flag_dollar_ok = 0;
64   gfc_option.flag_underscoring = 1;
65   gfc_option.flag_f2c = 0;
66   gfc_option.flag_second_underscore = -1;
67   gfc_option.flag_implicit_none = 0;
68   gfc_option.flag_max_stack_var_size = 32768;
69   gfc_option.flag_module_access_private = 0;
70   gfc_option.flag_no_backend = 0;
71   gfc_option.flag_pack_derived = 0;
72   gfc_option.flag_repack_arrays = 0;
73   gfc_option.flag_automatic = 1;
74   gfc_option.flag_backslash = 1;
75   gfc_option.flag_d_lines = -1;
76
77   gfc_option.q_kind = gfc_default_double_kind;
78
79   flag_argument_noalias = 2;
80   flag_errno_math = 0;
81
82   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
83     | GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU
84     | GFC_STD_LEGACY;
85   gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
86     | GFC_STD_F2003 | GFC_STD_LEGACY;
87
88   gfc_option.warn_nonstd_intrinsics = 0;
89
90   return CL_Fortran;
91 }
92
93
94 /* Determine the source form from the filename extension.  We assume
95    case insensitivity.  */
96
97 static gfc_source_form
98 form_from_filename (const char *filename)
99 {
100
101   static const struct
102   {
103     const char *extension;
104     gfc_source_form form;
105   }
106   exttype[] =
107   {
108     {
109     ".f90", FORM_FREE}
110     ,
111     {
112     ".f95", FORM_FREE}
113     ,
114     {
115     ".f", FORM_FIXED}
116     ,
117     {
118     ".for", FORM_FIXED}
119     ,
120     {
121     "", FORM_UNKNOWN}
122   };            /* sentinel value */
123
124   gfc_source_form f_form;
125   const char *fileext;
126   int i;
127
128   /* Find end of file name.  Note, filename is either a NULL pointer or
129      a NUL terminated string.  */
130   i = 0;
131   while (filename[i] != '\0')
132     i++;
133
134   /* Find last period.  */
135   while (i >= 0 && (filename[i] != '.'))
136     i--;
137
138   /* Did we see a file extension?  */
139   if (i < 0)
140     return FORM_UNKNOWN; /* Nope  */
141
142   /* Get file extension and compare it to others.  */
143   fileext = &(filename[i]);
144
145   i = -1;
146   f_form = FORM_UNKNOWN;
147   do
148     {
149       i++;
150       if (strcasecmp (fileext, exttype[i].extension) == 0)
151         {
152           f_form = exttype[i].form;
153           break;
154         }
155     }
156   while (exttype[i].form != FORM_UNKNOWN);
157
158   return f_form;
159 }
160
161
162 /* Finalize commandline options.  */
163
164 bool
165 gfc_post_options (const char **pfilename)
166 {
167   const char *filename = *pfilename;
168
169   /* Verify the input file name.  */
170   if (!filename || strcmp (filename, "-") == 0)
171     {
172       filename = "";
173     }
174
175   gfc_source_file = filename;
176
177   /* Decide which form the file will be read in as.  */
178
179   if (gfc_option.source_form != FORM_UNKNOWN)
180     gfc_current_form = gfc_option.source_form;
181   else
182     {
183       gfc_current_form = form_from_filename (filename);
184
185       if (gfc_current_form == FORM_UNKNOWN)
186         {
187           gfc_current_form = FORM_FREE;
188           gfc_warning_now ("Reading file '%s' as free form.", 
189                            (filename[0] == '\0') ? "<stdin>" : filename); 
190         }
191     }
192
193   /* If the user specified -fd-lines-as-{code|comments} verify that we're
194      in fixed form.  */
195   if (gfc_current_form == FORM_FREE)
196     {
197       if (gfc_option.flag_d_lines == 0)
198         gfc_warning_now ("'-fd-lines-as-comments' has no effect "
199                          "in free form.");
200       else if (gfc_option.flag_d_lines == 1)
201         gfc_warning_now ("'-fd-lines-as-code' has no effect "
202                          "in free form.");
203     }
204
205   flag_inline_trees = 1;
206
207   /* Use tree inlining.  */
208   if (!flag_no_inline)
209     flag_no_inline = 1;
210   if (flag_inline_functions)
211     flag_inline_trees = 2;
212
213   /* If -pedantic, warn about the use of GNU extensions.  */
214   if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0)
215     gfc_option.warn_std |= GFC_STD_GNU;
216   /* -std=legacy -pedantic is effectively -std=gnu.  */
217   if (pedantic && (gfc_option.allow_std & GFC_STD_LEGACY) != 0)
218     gfc_option.warn_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_LEGACY;
219
220   /* If the user didn't explicitly specify -f(no)-second-underscore we
221      use it if we're trying to be compatible with f2c, and not
222      otherwise.  */
223   if (gfc_option.flag_second_underscore == -1)
224     gfc_option.flag_second_underscore = gfc_option.flag_f2c;
225
226   /* Implement -fno-automatic as -fmax-stack-var-size=0.  */
227   if (!gfc_option.flag_automatic)
228     gfc_option.flag_max_stack_var_size = 0;
229
230   return false;
231 }
232
233
234 /* Set the options for -Wall.  */
235
236 static void
237 set_Wall (void)
238 {
239
240   gfc_option.warn_aliasing = 1;
241   gfc_option.warn_line_truncation = 1;
242   gfc_option.warn_underflow = 1;
243   gfc_option.warn_surprising = 1;
244   gfc_option.warn_unused_labels = 1;
245   gfc_option.warn_nonstd_intrinsics = 1;
246
247   set_Wunused (1);
248   warn_return_type = 1;
249   warn_switch = 1;
250
251   /* We save the value of warn_uninitialized, since if they put
252      -Wuninitialized on the command line, we need to generate a
253      warning about not using it without also specifying -O.  */
254
255   if (warn_uninitialized != 1)
256     warn_uninitialized = 2;
257 }
258
259
260 static void
261 gfc_handle_module_path_options (const char *arg)
262 {
263
264   if (gfc_option.module_dir != NULL)
265     {
266       gfc_status ("gfortran: Only one -M option allowed\n");
267       exit (3);
268     }
269
270   if (arg == NULL)
271     {
272       gfc_status ("gfortran: Directory required after -M\n");
273       exit (3);
274     }
275
276   gfc_option.module_dir = (char *) gfc_getmem (strlen (arg) + 2);
277   strcpy (gfc_option.module_dir, arg);
278   strcat (gfc_option.module_dir, "/");
279 }
280
281 /* Handle command-line options.  Returns 0 if unrecognized, 1 if
282    recognized and handled.  */
283 int
284 gfc_handle_option (size_t scode, const char *arg, int value)
285 {
286   int result = 1;
287   enum opt_code code = (enum opt_code) scode;
288
289   /* Ignore file names.  */
290   if (code == N_OPTS)
291     return 1;
292
293   switch (code)
294     {
295     default:
296       result = 0;
297       break;
298
299     case OPT_Wall:
300       set_Wall ();
301       break;
302
303     case OPT_Waliasing:
304       gfc_option.warn_aliasing = value;
305       break;
306
307     case OPT_Wconversion:
308       gfc_option.warn_conversion = value;
309       break;
310
311     case OPT_Wimplicit_interface:
312       gfc_option.warn_implicit_interface = value;
313       break;
314
315     case OPT_Wline_truncation:
316       gfc_option.warn_line_truncation = value;
317       break;
318
319     case OPT_Wunderflow:
320       gfc_option.warn_underflow = value;
321       break;
322
323     case OPT_Wsurprising:
324       gfc_option.warn_surprising = value;
325       break;
326
327     case OPT_Wunused_labels:
328       gfc_option.warn_unused_labels = value;
329       break;
330
331     case OPT_ff2c:
332       gfc_option.flag_f2c = value;
333       break;
334
335     case OPT_fdollar_ok:
336       gfc_option.flag_dollar_ok = value;
337       break;
338
339     case OPT_fautomatic:
340       gfc_option.flag_automatic = value;
341       break;
342
343     case OPT_fbackslash:
344       gfc_option.flag_backslash = value;
345       break;
346
347     case OPT_fd_lines_as_code:
348       gfc_option.flag_d_lines = 1;
349       break;
350
351     case OPT_fd_lines_as_comments:
352       gfc_option.flag_d_lines = 0;
353       break;
354
355     case OPT_fdump_parse_tree:
356       gfc_option.verbose = value;
357       break;
358
359     case OPT_ffixed_form:
360       gfc_option.source_form = FORM_FIXED;
361       break;
362
363     case OPT_ffree_form:
364       gfc_option.source_form = FORM_FREE;
365       break;
366
367     case OPT_funderscoring:
368       gfc_option.flag_underscoring = value;
369       break;
370
371     case OPT_fsecond_underscore:
372       gfc_option.flag_second_underscore = value;
373       break;
374
375     case OPT_fimplicit_none:
376       gfc_option.flag_implicit_none = value;
377       break;
378
379     case OPT_fmax_stack_var_size_:
380       gfc_option.flag_max_stack_var_size = value;
381       break;
382
383     case OPT_fmodule_private:
384       gfc_option.flag_module_access_private = value;
385       break;
386
387     case OPT_fno_backend:
388       gfc_option.flag_no_backend = value;
389       break;
390
391     case OPT_fpack_derived:
392       gfc_option.flag_pack_derived = value;
393       break;
394
395     case OPT_frepack_arrays:
396       gfc_option.flag_repack_arrays = value;
397       break;
398
399     case OPT_ffixed_line_length_none:
400       gfc_option.fixed_line_length = 0;
401       break;
402
403     case OPT_ffixed_line_length_:
404       if (value != 0 && value < 7)
405         gfc_fatal_error ("Fixed line length must be at least seven.");
406       gfc_option.fixed_line_length = value;
407       break;
408
409     case OPT_fmax_identifier_length_:
410       if (value > GFC_MAX_SYMBOL_LEN)
411         gfc_fatal_error ("Maximum supported idenitifier length is %d",
412                          GFC_MAX_SYMBOL_LEN);
413       gfc_option.max_identifier_length = value;
414       break;
415
416     case OPT_qkind_:
417       if (gfc_validate_kind (BT_REAL, value, true) < 0)
418         gfc_fatal_error ("Argument to -fqkind isn't a valid real kind");
419       gfc_option.q_kind = value;
420       break;
421
422     case OPT_fdefault_integer_8:
423       gfc_option.flag_default_integer = value;
424       break;
425
426     case OPT_fdefault_real_8:
427       gfc_option.flag_default_real = value;
428       break;
429
430     case OPT_fdefault_double_8:
431       gfc_option.flag_default_double = value;
432       break;
433
434     case OPT_I:
435       gfc_add_include_path (arg);
436       break;
437
438     case OPT_J:
439     case OPT_M:
440       gfc_handle_module_path_options (arg);
441       break;
442     
443     case OPT_std_f95:
444       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77;
445       gfc_option.warn_std = GFC_STD_F95_OBS;
446       gfc_option.max_identifier_length = 31;
447       break;
448
449     case OPT_std_f2003:
450       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
451         | GFC_STD_F2003 | GFC_STD_F95;
452       gfc_option.warn_std = GFC_STD_F95_OBS;
453       gfc_option.max_identifier_length = 63;
454       break;
455
456     case OPT_std_gnu:
457       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
458         | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
459         | GFC_STD_GNU | GFC_STD_LEGACY;
460       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
461         | GFC_STD_LEGACY;
462       break;
463
464     case OPT_std_legacy:
465       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
466         | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
467         | GFC_STD_GNU | GFC_STD_LEGACY;
468       gfc_option.warn_std = 0;
469       break;
470
471     case OPT_Wnonstd_intrinsics:
472       gfc_option.warn_nonstd_intrinsics = 1;
473       break;
474     }
475
476   return result;
477 }