OSDN Git Service

* gfortran.h (GFC_STD_LEGACY): New "standard" macro. Reindent.
[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, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, 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_option.source = 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
74   gfc_option.q_kind = gfc_default_double_kind;
75
76   flag_argument_noalias = 2;
77   flag_errno_math = 0;
78
79   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
80     | GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU
81     | GFC_STD_LEGACY;
82   gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
83     | GFC_STD_F2003 | GFC_STD_LEGACY;
84
85   gfc_option.warn_nonstd_intrinsics = 0;
86
87   return CL_F95;
88 }
89
90
91 /* Finalize commandline options.  */
92
93 bool
94 gfc_post_options (const char **pfilename)
95 {
96   const char *filename = *pfilename;
97
98   /* Verify the input file name.  */
99   if (!filename || strcmp (filename, "-") == 0)
100     {
101       filename = "";
102     }
103
104   gfc_option.source = filename;
105
106   flag_inline_trees = 1;
107
108   /* Use tree inlining.  */
109   if (!flag_no_inline)
110     flag_no_inline = 1;
111   if (flag_inline_functions)
112     flag_inline_trees = 2;
113
114   /* If -pedantic, warn about the use of GNU extensions.  */
115   if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0)
116     gfc_option.warn_std |= GFC_STD_GNU;
117   /* -std=legacy -pedantic is effectively -std=gnu.  */
118   if (pedantic && (gfc_option.allow_std & GFC_STD_LEGACY) != 0)
119     gfc_option.warn_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_LEGACY;
120
121   /* If the user didn't explicitly specify -f(no)-second-underscore we
122      use it if we're trying to be compatible with f2c, and not
123      otherwise.  */
124   if (gfc_option.flag_second_underscore == -1)
125     gfc_option.flag_second_underscore = gfc_option.flag_f2c;
126
127   return false;
128 }
129
130
131 /* Set the options for -Wall.  */
132
133 static void
134 set_Wall (void)
135 {
136
137   gfc_option.warn_aliasing = 1;
138   gfc_option.warn_line_truncation = 1;
139   gfc_option.warn_underflow = 1;
140   gfc_option.warn_surprising = 1;
141   gfc_option.warn_unused_labels = 1;
142   gfc_option.warn_nonstd_intrinsics = 1;
143
144   set_Wunused (1);
145   warn_return_type = 1;
146   warn_switch = 1;
147
148   /* We save the value of warn_uninitialized, since if they put
149      -Wuninitialized on the command line, we need to generate a
150      warning about not using it without also specifying -O.  */
151
152   if (warn_uninitialized != 1)
153     warn_uninitialized = 2;
154 }
155
156
157 static void
158 gfc_handle_module_path_options (const char *arg)
159 {
160
161   if (gfc_option.module_dir != NULL)
162     {
163       gfc_status ("gfortran: Only one -M option allowed\n");
164       exit (3);
165     }
166
167   if (arg == NULL)
168     {
169       gfc_status ("gfortran: Directory required after -M\n");
170       exit (3);
171     }
172
173   gfc_option.module_dir = (char *) gfc_getmem (strlen (arg) + 2);
174   strcpy (gfc_option.module_dir, arg);
175   strcat (gfc_option.module_dir, "/");
176 }
177
178 /* Handle command-line options.  Returns 0 if unrecognized, 1 if
179    recognized and handled.  */
180 int
181 gfc_handle_option (size_t scode, const char *arg, int value)
182 {
183   int result = 1;
184   enum opt_code code = (enum opt_code) scode;
185
186   /* Ignore file names.  */
187   if (code == N_OPTS)
188     return 1;
189
190   switch (code)
191     {
192     default:
193       result = 0;
194       break;
195
196     case OPT_Wall:
197       set_Wall ();
198       break;
199
200     case OPT_Waliasing:
201       gfc_option.warn_aliasing = value;
202       break;
203
204     case OPT_Wconversion:
205       gfc_option.warn_conversion = value;
206       break;
207
208     case OPT_Wimplicit_interface:
209       gfc_option.warn_implicit_interface = value;
210       break;
211
212     case OPT_Wline_truncation:
213       gfc_option.warn_line_truncation = value;
214       break;
215
216     case OPT_Wunderflow:
217       gfc_option.warn_underflow = value;
218       break;
219
220     case OPT_Wsurprising:
221       gfc_option.warn_surprising = value;
222       break;
223
224     case OPT_Wunused_labels:
225       gfc_option.warn_unused_labels = value;
226       break;
227
228     case OPT_ff2c:
229       gfc_option.flag_f2c = value;
230       break;
231
232     case OPT_fdollar_ok:
233       gfc_option.flag_dollar_ok = value;
234       break;
235
236     case OPT_fdump_parse_tree:
237       gfc_option.verbose = value;
238       break;
239
240     case OPT_ffixed_form:
241       gfc_option.source_form = FORM_FIXED;
242       break;
243
244     case OPT_ffree_form:
245       gfc_option.source_form = FORM_FREE;
246       break;
247
248     case OPT_funderscoring:
249       gfc_option.flag_underscoring = value;
250       break;
251
252     case OPT_fsecond_underscore:
253       gfc_option.flag_second_underscore = value;
254       break;
255
256     case OPT_fimplicit_none:
257       gfc_option.flag_implicit_none = value;
258       break;
259
260     case OPT_fmax_stack_var_size_:
261       gfc_option.flag_max_stack_var_size = value;
262       break;
263
264     case OPT_fmodule_private:
265       gfc_option.flag_module_access_private = value;
266       break;
267
268     case OPT_fno_backend:
269       gfc_option.flag_no_backend = value;
270       break;
271
272     case OPT_fpack_derived:
273       gfc_option.flag_pack_derived = value;
274       break;
275
276     case OPT_frepack_arrays:
277       gfc_option.flag_repack_arrays = value;
278       break;
279
280     case OPT_ffixed_line_length_none:
281       gfc_option.fixed_line_length = 0;
282       break;
283
284     case OPT_ffixed_line_length_:
285       if (value != 0 && value < 7)
286         gfc_fatal_error ("Fixed line length must be at least seven.");
287       gfc_option.fixed_line_length = value;
288       break;
289
290     case OPT_fmax_identifier_length_:
291       if (value > GFC_MAX_SYMBOL_LEN)
292         gfc_fatal_error ("Maximum supported idenitifier length is %d",
293                          GFC_MAX_SYMBOL_LEN);
294       gfc_option.max_identifier_length = value;
295       break;
296
297     case OPT_qkind_:
298       if (gfc_validate_kind (BT_REAL, value, true) < 0)
299         gfc_fatal_error ("Argument to -fqkind isn't a valid real kind");
300       gfc_option.q_kind = value;
301       break;
302
303     case OPT_fdefault_integer_8:
304       gfc_option.flag_default_integer = value;
305       break;
306
307     case OPT_fdefault_real_8:
308       gfc_option.flag_default_real = value;
309       break;
310
311     case OPT_fdefault_double_8:
312       gfc_option.flag_default_double = value;
313       break;
314
315     case OPT_I:
316       gfc_add_include_path (arg);
317       break;
318
319     case OPT_J:
320     case OPT_M:
321       gfc_handle_module_path_options (arg);
322       break;
323     
324     case OPT_std_f95:
325       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77;
326       gfc_option.warn_std = GFC_STD_F95_OBS;
327       gfc_option.max_identifier_length = 31;
328       break;
329
330     case OPT_std_f2003:
331       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
332         | GFC_STD_F2003 | GFC_STD_F95;
333       gfc_option.warn_std = GFC_STD_F95_OBS;
334       gfc_option.max_identifier_length = 63;
335       break;
336
337     case OPT_std_gnu:
338       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
339         | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
340         | GFC_STD_GNU | GFC_STD_LEGACY;
341       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
342         | GFC_STD_LEGACY;
343       break;
344
345     case OPT_std_legacy:
346       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
347         | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
348         | GFC_STD_GNU | GFC_STD_LEGACY;
349       gfc_option.warn_std = 0;
350       break;
351
352     case OPT_Wnonstd_intrinsics:
353       gfc_option.warn_nonstd_intrinsics = 1;
354       break;
355     }
356
357   return result;
358 }