c-opts.c revision 259405
1/* C/ObjC/C++ command line option handling.
2   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
3   Free Software Foundation, Inc.
4   Contributed by Neil Booth.
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING.  If not, write to the Free
20Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2102110-1301, USA.  */
22
23/* $FreeBSD: stable/10/contrib/gcc/c-opts.c 259405 2013-12-15 03:47:31Z pfg $ */
24/* Merged C99 inline changes from gcc trunk 122565 2007-03-05 */
25
26#include "config.h"
27#include "system.h"
28#include "coretypes.h"
29#include "tm.h"
30#include "tree.h"
31#include "c-common.h"
32#include "c-pragma.h"
33#include "flags.h"
34#include "toplev.h"
35#include "langhooks.h"
36#include "tree-inline.h"
37#include "diagnostic.h"
38#include "intl.h"
39#include "cppdefault.h"
40#include "c-incpath.h"
41#include "debug.h"		/* For debug_hooks.  */
42#include "opts.h"
43#include "options.h"
44#include "mkdeps.h"
45
46#ifndef DOLLARS_IN_IDENTIFIERS
47# define DOLLARS_IN_IDENTIFIERS true
48#endif
49
50#ifndef TARGET_SYSTEM_ROOT
51# define TARGET_SYSTEM_ROOT NULL
52#endif
53
54#ifndef TARGET_OPTF
55#define TARGET_OPTF(ARG)
56#endif
57
58/* CPP's options.  */
59static cpp_options *cpp_opts;
60
61/* Input filename.  */
62static const char *this_input_filename;
63
64/* Filename and stream for preprocessed output.  */
65static const char *out_fname;
66static FILE *out_stream;
67
68/* Append dependencies to deps_file.  */
69static bool deps_append;
70
71/* If dependency switches (-MF etc.) have been given.  */
72static bool deps_seen;
73
74/* If -v seen.  */
75static bool verbose;
76
77/* If -lang-fortran seen.  */
78static bool lang_fortran = false;
79
80/* Dependency output file.  */
81static const char *deps_file;
82
83/* The prefix given by -iprefix, if any.  */
84static const char *iprefix;
85
86/* The multilib directory given by -imultilib, if any.  */
87static const char *imultilib;
88
89/* The system root, if any.  Overridden by -isysroot.  */
90static const char *sysroot = TARGET_SYSTEM_ROOT;
91
92/* Zero disables all standard directories for headers.  */
93static bool std_inc = true;
94
95/* Zero disables the C++-specific standard directories for headers.  */
96static bool std_cxx_inc = true;
97
98/* If the quote chain has been split by -I-.  */
99static bool quote_chain_split;
100
101/* If -Wunused-macros.  */
102static bool warn_unused_macros;
103
104/* If -Wvariadic-macros.  */
105static bool warn_variadic_macros = true;
106
107/* Number of deferred options.  */
108static size_t deferred_count;
109
110/* Number of deferred options scanned for -include.  */
111static size_t include_cursor;
112
113static void set_Wimplicit (int);
114static void handle_OPT_d (const char *);
115static void set_std_cxx98 (int);
116static void set_std_c89 (int, int);
117static void set_std_c99 (int);
118static void check_deps_environment_vars (void);
119static void handle_deferred_opts (void);
120static void sanitize_cpp_opts (void);
121static void add_prefixed_path (const char *, size_t);
122static void push_command_line_include (void);
123static void cb_file_change (cpp_reader *, const struct line_map *);
124static void cb_dir_change (cpp_reader *, const char *);
125static void finish_options (void);
126
127#ifndef STDC_0_IN_SYSTEM_HEADERS
128#define STDC_0_IN_SYSTEM_HEADERS 0
129#endif
130
131/* Holds switches parsed by c_common_handle_option (), but whose
132   handling is deferred to c_common_post_options ().  */
133static void defer_opt (enum opt_code, const char *);
134static struct deferred_opt
135{
136  enum opt_code code;
137  const char *arg;
138} *deferred_opts;
139
140/* Complain that switch CODE expects an argument but none was
141   provided.  OPT was the command-line option.  Return FALSE to get
142   the default message in opts.c, TRUE if we provide a specialized
143   one.  */
144bool
145c_common_missing_argument (const char *opt, size_t code)
146{
147  switch (code)
148    {
149    default:
150      /* Pick up the default message.  */
151      return false;
152
153    case OPT_fconstant_string_class_:
154      error ("no class name specified with %qs", opt);
155      break;
156
157    case OPT_A:
158      error ("assertion missing after %qs", opt);
159      break;
160
161    case OPT_D:
162    case OPT_U:
163      error ("macro name missing after %qs", opt);
164      break;
165
166    case OPT_F:
167    case OPT_I:
168    case OPT_idirafter:
169    case OPT_isysroot:
170    case OPT_isystem:
171    case OPT_iquote:
172      error ("missing path after %qs", opt);
173      break;
174
175    case OPT_MF:
176    case OPT_MD:
177    case OPT_MMD:
178    case OPT_include:
179    case OPT_imacros:
180    case OPT_o:
181      error ("missing filename after %qs", opt);
182      break;
183
184    case OPT_MQ:
185    case OPT_MT:
186      error ("missing makefile target after %qs", opt);
187      break;
188    }
189
190  return true;
191}
192
193/* Defer option CODE with argument ARG.  */
194static void
195defer_opt (enum opt_code code, const char *arg)
196{
197  deferred_opts[deferred_count].code = code;
198  deferred_opts[deferred_count].arg = arg;
199  deferred_count++;
200}
201
202/* Common initialization before parsing options.  */
203unsigned int
204c_common_init_options (unsigned int argc, const char **argv)
205{
206  static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
207  unsigned int i, result;
208
209  /* This is conditionalized only because that is the way the front
210     ends used to do it.  Maybe this should be unconditional?  */
211  if (c_dialect_cxx ())
212    {
213      /* By default wrap lines at 80 characters.  Is getenv
214	 ("COLUMNS") preferable?  */
215      diagnostic_line_cutoff (global_dc) = 80;
216      /* By default, emit location information once for every
217	 diagnostic message.  */
218      diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
219    }
220
221  parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
222				ident_hash, &line_table);
223
224  cpp_opts = cpp_get_options (parse_in);
225  cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
226  cpp_opts->objc = c_dialect_objc ();
227
228  /* Reset to avoid warnings on internal definitions.  We set it just
229     before passing on command-line options to cpplib.  */
230  cpp_opts->warn_dollars = 0;
231
232  flag_exceptions = c_dialect_cxx ();
233  warn_pointer_arith = c_dialect_cxx ();
234  warn_write_strings = c_dialect_cxx();
235
236  deferred_opts = XNEWVEC (struct deferred_opt, argc);
237
238  result = lang_flags[c_language];
239
240  if (c_language == clk_c)
241    {
242      /* If preprocessing assembly language, accept any of the C-family
243	 front end options since the driver may pass them through.  */
244      for (i = 1; i < argc; i++)
245	if (! strcmp (argv[i], "-lang-asm"))
246	  {
247	    result |= CL_C | CL_ObjC | CL_CXX | CL_ObjCXX;
248	    break;
249	  }
250
251#ifdef CL_Fortran
252      for (i = 1; i < argc; i++)
253	if (! strcmp (argv[i], "-lang-fortran"))
254	{
255	    result |= CL_Fortran;
256	    break;
257	}
258#endif
259    }
260
261  return result;
262}
263
264/* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
265   form of an -f or -W option was given.  Returns 0 if the switch was
266   invalid, a negative number to prevent language-independent
267   processing in toplev.c (a hack necessary for the short-term).  */
268int
269c_common_handle_option (size_t scode, const char *arg, int value)
270{
271  const struct cl_option *option = &cl_options[scode];
272  enum opt_code code = (enum opt_code) scode;
273  int result = 1;
274
275  /* Prevent resetting the language standard to a C dialect when the driver
276     has already determined that we're looking at assembler input.  */
277  bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
278
279  switch (code)
280    {
281    default:
282      if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX))
283	break;
284#ifdef CL_Fortran
285      if (lang_fortran && (cl_options[code].flags & (CL_Fortran)))
286	break;
287#endif
288      result = 0;
289      break;
290
291    case OPT__output_pch_:
292      pch_file = arg;
293      break;
294
295    case OPT_A:
296      defer_opt (code, arg);
297      break;
298
299    case OPT_C:
300      cpp_opts->discard_comments = 0;
301      break;
302
303    case OPT_CC:
304      cpp_opts->discard_comments = 0;
305      cpp_opts->discard_comments_in_macro_exp = 0;
306      break;
307
308    case OPT_D:
309      defer_opt (code, arg);
310      break;
311
312    case OPT_E:
313      flag_preprocess_only = 1;
314      break;
315
316    case OPT_H:
317      cpp_opts->print_include_names = 1;
318      break;
319
320    case OPT_F:
321      TARGET_OPTF (xstrdup (arg));
322      break;
323
324    case OPT_I:
325      if (strcmp (arg, "-"))
326	add_path (xstrdup (arg), BRACKET, 0, true);
327      else
328	{
329	  if (quote_chain_split)
330	    error ("-I- specified twice");
331	  quote_chain_split = true;
332	  split_quote_chain ();
333	  inform ("obsolete option -I- used, please use -iquote instead");
334	}
335      break;
336
337    case OPT_M:
338    case OPT_MM:
339      /* When doing dependencies with -M or -MM, suppress normal
340	 preprocessed output, but still do -dM etc. as software
341	 depends on this.  Preprocessed output does occur if -MD, -MMD
342	 or environment var dependency generation is used.  */
343      cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
344      flag_no_output = 1;
345      cpp_opts->inhibit_warnings = 1;
346      break;
347
348    case OPT_MD:
349    case OPT_MMD:
350      cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
351      deps_file = arg;
352      break;
353
354    case OPT_MF:
355      deps_seen = true;
356      deps_file = arg;
357      break;
358
359    case OPT_MG:
360      deps_seen = true;
361      cpp_opts->deps.missing_files = true;
362      break;
363
364    case OPT_MP:
365      deps_seen = true;
366      cpp_opts->deps.phony_targets = true;
367      break;
368
369    case OPT_MQ:
370    case OPT_MT:
371      deps_seen = true;
372      defer_opt (code, arg);
373      break;
374
375    case OPT_P:
376      flag_no_line_commands = 1;
377      break;
378
379    case OPT_fworking_directory:
380      flag_working_directory = value;
381      break;
382
383    case OPT_U:
384      defer_opt (code, arg);
385      break;
386
387    case OPT_Wall:
388      set_Wunused (value);
389      set_Wformat (value);
390      set_Wimplicit (value);
391      warn_char_subscripts = value;
392      warn_missing_braces = value;
393      warn_parentheses = value;
394      warn_return_type = value;
395      warn_sequence_point = value;	/* Was C only.  */
396      if (c_dialect_cxx ())
397	warn_sign_compare = value;
398      warn_switch = value;
399      set_warn_strict_aliasing (value);
400      warn_strict_overflow = value;
401      warn_address = value;
402
403      /* Only warn about unknown pragmas that are not in system
404	 headers.  */
405      warn_unknown_pragmas = value;
406
407      /* We save the value of warn_uninitialized, since if they put
408	 -Wuninitialized on the command line, we need to generate a
409	 warning about not using it without also specifying -O.  */
410      if (warn_uninitialized != 1)
411	warn_uninitialized = (value ? 2 : 0);
412
413      if (!c_dialect_cxx ())
414	/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
415	   can turn it off only if it's not explicit.  */
416	warn_main = value * 2;
417      else
418	{
419	  /* C++-specific warnings.  */
420	  warn_reorder = value;
421	  warn_nontemplate_friend = value;
422	}
423
424      cpp_opts->warn_trigraphs = value;
425      cpp_opts->warn_comments = value;
426      cpp_opts->warn_num_sign_change = value;
427      cpp_opts->warn_multichar = value;	/* Was C++ only.  */
428
429      if (warn_pointer_sign == -1)
430	warn_pointer_sign = 1;
431      break;
432
433    case OPT_Wcomment:
434    case OPT_Wcomments:
435      cpp_opts->warn_comments = value;
436      break;
437
438    case OPT_Wdeprecated:
439      cpp_opts->warn_deprecated = value;
440      break;
441
442    case OPT_Wendif_labels:
443      cpp_opts->warn_endif_labels = value;
444      break;
445
446    case OPT_Werror:
447      cpp_opts->warnings_are_errors = value;
448      global_dc->warning_as_error_requested = value;
449      break;
450
451    case OPT_Werror_implicit_function_declaration:
452      mesg_implicit_function_declaration = 2;
453      break;
454
455    case OPT_Wformat:
456      set_Wformat (value);
457      break;
458
459    case OPT_Wformat_:
460      set_Wformat (atoi (arg));
461      break;
462
463    case OPT_Wimplicit:
464      set_Wimplicit (value);
465      break;
466
467    case OPT_Wimport:
468      /* Silently ignore for now.  */
469      break;
470
471    case OPT_Winvalid_pch:
472      cpp_opts->warn_invalid_pch = value;
473      break;
474
475    case OPT_Wmain:
476      if (value)
477	warn_main = 1;
478      else
479	warn_main = -1;
480      break;
481
482    case OPT_Wmissing_include_dirs:
483      cpp_opts->warn_missing_include_dirs = value;
484      break;
485
486    case OPT_Wmultichar:
487      cpp_opts->warn_multichar = value;
488      break;
489
490    case OPT_Wnormalized_:
491      if (!value || (arg && strcasecmp (arg, "none") == 0))
492	cpp_opts->warn_normalize = normalized_none;
493      else if (!arg || strcasecmp (arg, "nfkc") == 0)
494	cpp_opts->warn_normalize = normalized_KC;
495      else if (strcasecmp (arg, "id") == 0)
496	cpp_opts->warn_normalize = normalized_identifier_C;
497      else if (strcasecmp (arg, "nfc") == 0)
498	cpp_opts->warn_normalize = normalized_C;
499      else
500	error ("argument %qs to %<-Wnormalized%> not recognized", arg);
501      break;
502
503    case OPT_Wreturn_type:
504      warn_return_type = value;
505      break;
506
507    case OPT_Wstrict_null_sentinel:
508      warn_strict_null_sentinel = value;
509      break;
510
511    case OPT_Wsystem_headers:
512      cpp_opts->warn_system_headers = value;
513      break;
514
515    case OPT_Wtraditional:
516      cpp_opts->warn_traditional = value;
517      break;
518
519    case OPT_Wtrigraphs:
520      cpp_opts->warn_trigraphs = value;
521      break;
522
523    case OPT_Wundef:
524      cpp_opts->warn_undef = value;
525      break;
526
527    case OPT_Wunknown_pragmas:
528      /* Set to greater than 1, so that even unknown pragmas in
529	 system headers will be warned about.  */
530      warn_unknown_pragmas = value * 2;
531      break;
532
533    case OPT_Wunused_macros:
534      warn_unused_macros = value;
535      break;
536
537    case OPT_Wvariadic_macros:
538      warn_variadic_macros = value;
539      break;
540
541    case OPT_Wwrite_strings:
542      warn_write_strings = value;
543      break;
544
545    case OPT_Weffc__:
546      warn_ecpp = value;
547      if (value)
548        warn_nonvdtor = true;
549      break;
550
551    case OPT_ansi:
552      if (!c_dialect_cxx ())
553	set_std_c89 (false, true);
554      else
555	set_std_cxx98 (true);
556      break;
557
558    case OPT_d:
559      handle_OPT_d (arg);
560      break;
561
562    case OPT_fcond_mismatch:
563      if (!c_dialect_cxx ())
564	{
565	  flag_cond_mismatch = value;
566	  break;
567	}
568      /* Fall through.  */
569
570    case OPT_fall_virtual:
571    case OPT_falt_external_templates:
572    case OPT_fenum_int_equiv:
573    case OPT_fexternal_templates:
574    case OPT_fguiding_decls:
575    case OPT_fhonor_std:
576    case OPT_fhuge_objects:
577    case OPT_flabels_ok:
578    case OPT_fname_mangling_version_:
579    case OPT_fnew_abi:
580    case OPT_fnonnull_objects:
581    case OPT_fsquangle:
582    case OPT_fstrict_prototype:
583    case OPT_fthis_is_variable:
584    case OPT_fvtable_thunks:
585    case OPT_fxref:
586    case OPT_fvtable_gc:
587      warning (0, "switch %qs is no longer supported", option->opt_text);
588      break;
589
590    case OPT_faccess_control:
591      flag_access_control = value;
592      break;
593
594    case OPT_fasm:
595      flag_no_asm = !value;
596      break;
597
598    case OPT_fbuiltin:
599      flag_no_builtin = !value;
600      break;
601
602    case OPT_fbuiltin_:
603      if (value)
604	result = 0;
605      else
606	disable_builtin_function (arg);
607      break;
608
609    case OPT_fdirectives_only:
610      cpp_opts->directives_only = 1;
611      break;
612
613    case OPT_fdollars_in_identifiers:
614      cpp_opts->dollars_in_ident = value;
615      break;
616
617    case OPT_ffreestanding:
618      value = !value;
619      /* Fall through....  */
620    case OPT_fhosted:
621      flag_hosted = value;
622      flag_no_builtin = !value;
623      /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
624      if (!value && warn_main == 2)
625	warn_main = 0;
626      break;
627
628    case OPT_fshort_double:
629      flag_short_double = value;
630      break;
631
632    case OPT_fshort_enums:
633      flag_short_enums = value;
634      break;
635
636    case OPT_fshort_wchar:
637      flag_short_wchar = value;
638      break;
639
640    case OPT_fsigned_bitfields:
641      flag_signed_bitfields = value;
642      break;
643
644    case OPT_fsigned_char:
645      flag_signed_char = value;
646      break;
647
648    case OPT_funsigned_bitfields:
649      flag_signed_bitfields = !value;
650      break;
651
652    case OPT_funsigned_char:
653      flag_signed_char = !value;
654      break;
655
656    case OPT_fcheck_new:
657      flag_check_new = value;
658      break;
659
660    case OPT_fconserve_space:
661      flag_conserve_space = value;
662      break;
663
664    case OPT_fconstant_string_class_:
665      constant_string_class_name = arg;
666      break;
667
668    case OPT_fdefault_inline:
669      flag_default_inline = value;
670      break;
671
672    case OPT_felide_constructors:
673      flag_elide_constructors = value;
674      break;
675
676    case OPT_fenforce_eh_specs:
677      flag_enforce_eh_specs = value;
678      break;
679
680    case OPT_fextended_identifiers:
681      cpp_opts->extended_identifiers = value;
682      break;
683
684    case OPT_ffor_scope:
685      flag_new_for_scope = value;
686      break;
687
688    case OPT_fgnu_keywords:
689      flag_no_gnu_keywords = !value;
690      break;
691
692    case OPT_fgnu_runtime:
693      flag_next_runtime = !value;
694      break;
695
696    case OPT_fhandle_exceptions:
697      warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
698      flag_exceptions = value;
699      break;
700
701    case OPT_fimplement_inlines:
702      flag_implement_inlines = value;
703      break;
704
705    case OPT_fimplicit_inline_templates:
706      flag_implicit_inline_templates = value;
707      break;
708
709    case OPT_fimplicit_templates:
710      flag_implicit_templates = value;
711      break;
712
713    case OPT_fms_extensions:
714      flag_ms_extensions = value;
715      break;
716
717    case OPT_fnext_runtime:
718      flag_next_runtime = value;
719      break;
720
721    case OPT_fnil_receivers:
722      flag_nil_receivers = value;
723      break;
724
725    case OPT_fnonansi_builtins:
726      flag_no_nonansi_builtin = !value;
727      break;
728
729    case OPT_foperator_names:
730      cpp_opts->operator_names = value;
731      break;
732
733    case OPT_foptional_diags:
734      flag_optional_diags = value;
735      break;
736
737    case OPT_fpch_deps:
738      cpp_opts->restore_pch_deps = value;
739      break;
740
741    case OPT_fpch_preprocess:
742      flag_pch_preprocess = value;
743      break;
744
745    case OPT_fpermissive:
746      flag_permissive = value;
747      break;
748
749    case OPT_fpreprocessed:
750      cpp_opts->preprocessed = value;
751      break;
752
753    case OPT_freplace_objc_classes:
754      flag_replace_objc_classes = value;
755      break;
756
757    case OPT_frepo:
758      flag_use_repository = value;
759      if (value)
760	flag_implicit_templates = 0;
761      break;
762
763    case OPT_frtti:
764      flag_rtti = value;
765      break;
766
767    case OPT_fshow_column:
768      cpp_opts->show_column = value;
769      break;
770
771    case OPT_fstats:
772      flag_detailed_statistics = value;
773      break;
774
775    case OPT_ftabstop_:
776      /* It is documented that we silently ignore silly values.  */
777      if (value >= 1 && value <= 100)
778	cpp_opts->tabstop = value;
779      break;
780
781    case OPT_fexec_charset_:
782      cpp_opts->narrow_charset = arg;
783      break;
784
785    case OPT_fwide_exec_charset_:
786      cpp_opts->wide_charset = arg;
787      break;
788
789    case OPT_finput_charset_:
790      cpp_opts->input_charset = arg;
791      break;
792
793    case OPT_ftemplate_depth_:
794      max_tinst_depth = value;
795      break;
796
797    case OPT_fuse_cxa_atexit:
798      flag_use_cxa_atexit = value;
799      break;
800
801    case OPT_fuse_cxa_get_exception_ptr:
802      flag_use_cxa_get_exception_ptr = value;
803      break;
804
805    case OPT_fvisibility_inlines_hidden:
806      visibility_options.inlines_hidden = value;
807      break;
808
809    case OPT_fweak:
810      flag_weak = value;
811      break;
812
813    case OPT_fthreadsafe_statics:
814      flag_threadsafe_statics = value;
815      break;
816
817    case OPT_fzero_link:
818      flag_zero_link = value;
819      break;
820
821    case OPT_gen_decls:
822      flag_gen_declaration = 1;
823      break;
824
825    case OPT_femit_struct_debug_baseonly:
826      set_struct_debug_option ("base");
827      break;
828
829    case OPT_femit_struct_debug_reduced:
830      set_struct_debug_option ("dir:ord:sys,dir:gen:any,ind:base");
831      break;
832
833    case OPT_femit_struct_debug_detailed_:
834      set_struct_debug_option (arg);
835      break;
836
837    case OPT_idirafter:
838      add_path (xstrdup (arg), AFTER, 0, true);
839      break;
840
841    case OPT_imacros:
842    case OPT_include:
843      defer_opt (code, arg);
844      break;
845
846    case OPT_imultilib:
847      imultilib = arg;
848      break;
849
850    case OPT_iprefix:
851      iprefix = arg;
852      break;
853
854    case OPT_iquote:
855      add_path (xstrdup (arg), QUOTE, 0, true);
856      break;
857
858    case OPT_isysroot:
859      sysroot = arg;
860      break;
861
862    case OPT_isystem:
863      add_path (xstrdup (arg), SYSTEM, 0, true);
864      break;
865
866    case OPT_iwithprefix:
867      add_prefixed_path (arg, SYSTEM);
868      break;
869
870    case OPT_iwithprefixbefore:
871      add_prefixed_path (arg, BRACKET);
872      break;
873
874    case OPT_lang_asm:
875      cpp_set_lang (parse_in, CLK_ASM);
876      cpp_opts->dollars_in_ident = false;
877      break;
878
879    case OPT_lang_fortran:
880      lang_fortran = true;
881      break;
882
883    case OPT_lang_objc:
884      cpp_opts->objc = 1;
885      break;
886
887    case OPT_nostdinc:
888      std_inc = false;
889      break;
890
891    case OPT_nostdinc__:
892      std_cxx_inc = false;
893      break;
894
895    case OPT_o:
896      if (!out_fname)
897	out_fname = arg;
898      else
899	error ("output filename specified twice");
900      break;
901
902      /* We need to handle the -pedantic switches here, rather than in
903	 c_common_post_options, so that a subsequent -Wno-endif-labels
904	 is not overridden.  */
905    case OPT_pedantic_errors:
906      cpp_opts->pedantic_errors = 1;
907      /* Fall through.  */
908    case OPT_pedantic:
909      cpp_opts->pedantic = 1;
910      cpp_opts->warn_endif_labels = 1;
911      if (warn_pointer_sign == -1)
912	warn_pointer_sign = 1;
913      if (warn_overlength_strings == -1)
914	warn_overlength_strings = 1;
915      break;
916
917    case OPT_print_objc_runtime_info:
918      print_struct_values = 1;
919      break;
920
921    case OPT_print_pch_checksum:
922      c_common_print_pch_checksum (stdout);
923      exit_after_options = true;
924      break;
925
926    case OPT_remap:
927      cpp_opts->remap = 1;
928      break;
929
930    case OPT_std_c__98:
931    case OPT_std_gnu__98:
932      if (!preprocessing_asm_p)
933	set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
934      break;
935
936    case OPT_std_c89:
937    case OPT_std_iso9899_1990:
938    case OPT_std_iso9899_199409:
939      if (!preprocessing_asm_p)
940	set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
941      break;
942
943    case OPT_std_gnu89:
944      if (!preprocessing_asm_p)
945	set_std_c89 (false /* c94 */, false /* ISO */);
946      break;
947
948    case OPT_std_c99:
949    case OPT_std_c9x:
950    case OPT_std_iso9899_1999:
951    case OPT_std_iso9899_199x:
952      if (!preprocessing_asm_p)
953	set_std_c99 (true /* ISO */);
954      break;
955
956    case OPT_std_gnu99:
957    case OPT_std_gnu9x:
958      if (!preprocessing_asm_p)
959	set_std_c99 (false /* ISO */);
960      break;
961
962    case OPT_trigraphs:
963      cpp_opts->trigraphs = 1;
964      break;
965
966    case OPT_traditional_cpp:
967      cpp_opts->traditional = 1;
968      break;
969
970    case OPT_undef:
971      flag_undef = 1;
972      break;
973
974    case OPT_w:
975      cpp_opts->inhibit_warnings = 1;
976      break;
977
978    case OPT_v:
979      verbose = true;
980      break;
981    }
982
983  return result;
984}
985
986/* Post-switch processing.  */
987bool
988c_common_post_options (const char **pfilename)
989{
990  struct cpp_callbacks *cb;
991
992  /* Canonicalize the input and output filenames.  */
993  if (in_fnames == NULL)
994    {
995      in_fnames = XNEWVEC (const char *, 1);
996      in_fnames[0] = "";
997    }
998  else if (strcmp (in_fnames[0], "-") == 0)
999    in_fnames[0] = "";
1000
1001  if (out_fname == NULL || !strcmp (out_fname, "-"))
1002    out_fname = "";
1003
1004  if (cpp_opts->deps.style == DEPS_NONE)
1005    check_deps_environment_vars ();
1006
1007  handle_deferred_opts ();
1008
1009  sanitize_cpp_opts ();
1010
1011  register_include_chains (parse_in, sysroot, iprefix, imultilib,
1012			   std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1013
1014#ifdef C_COMMON_OVERRIDE_OPTIONS
1015  /* Some machines may reject certain combinations of C
1016     language-specific options.  */
1017  C_COMMON_OVERRIDE_OPTIONS;
1018#endif
1019
1020  flag_inline_trees = 1;
1021
1022  /* Use tree inlining.  */
1023  if (!flag_no_inline)
1024    flag_no_inline = 1;
1025  if (flag_inline_functions)
1026    flag_inline_trees = 2;
1027
1028  /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
1029     inline semantics are not supported in GNU89 or C89 mode.  */
1030  if (flag_gnu89_inline == -1)
1031    flag_gnu89_inline = !flag_isoc99;
1032  else if (!flag_gnu89_inline && !flag_isoc99)
1033    error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
1034
1035  /* If we are given more than one input file, we must use
1036     unit-at-a-time mode.  */
1037  if (num_in_fnames > 1)
1038    flag_unit_at_a_time = 1;
1039
1040  /* Default to ObjC sjlj exception handling if NeXT runtime.  */
1041  if (flag_objc_sjlj_exceptions < 0)
1042    flag_objc_sjlj_exceptions = flag_next_runtime;
1043  if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
1044    flag_exceptions = 1;
1045
1046  /* -Wextra implies -Wsign-compare, -Wmissing-field-initializers and
1047     -Woverride-init, but not if explicitly overridden.  */
1048  if (warn_sign_compare == -1)
1049    warn_sign_compare = extra_warnings;
1050  if (warn_missing_field_initializers == -1)
1051    warn_missing_field_initializers = extra_warnings;
1052  if (warn_override_init == -1)
1053    warn_override_init = extra_warnings;
1054
1055  /* -Wpointer_sign is disabled by default, but it is enabled if any
1056     of -Wall or -pedantic are given.  */
1057  if (warn_pointer_sign == -1)
1058    warn_pointer_sign = 0;
1059
1060  /* -Woverlength-strings is off by default, but is enabled by -pedantic.
1061     It is never enabled in C++, as the minimum limit is not normative
1062     in that standard.  */
1063  if (warn_overlength_strings == -1 || c_dialect_cxx ())
1064    warn_overlength_strings = 0;
1065
1066  /* Special format checking options don't work without -Wformat; warn if
1067     they are used.  */
1068  if (!warn_format)
1069    {
1070      warning (OPT_Wformat_y2k,
1071	       "-Wformat-y2k ignored without -Wformat");
1072      warning (OPT_Wformat_extra_args,
1073	       "-Wformat-extra-args ignored without -Wformat");
1074      warning (OPT_Wformat_zero_length,
1075	       "-Wformat-zero-length ignored without -Wformat");
1076      warning (OPT_Wformat_nonliteral,
1077	       "-Wformat-nonliteral ignored without -Wformat");
1078      warning (OPT_Wformat_security,
1079	       "-Wformat-security ignored without -Wformat");
1080    }
1081
1082  /* C99 requires special handling of complex multiplication and division;
1083     -ffast-math and -fcx-limited-range are handled in process_options.  */
1084  if (flag_isoc99)
1085    flag_complex_method = 2;
1086
1087  if (flag_preprocess_only)
1088    {
1089      /* Open the output now.  We must do so even if flag_no_output is
1090	 on, because there may be other output than from the actual
1091	 preprocessing (e.g. from -dM).  */
1092      if (out_fname[0] == '\0')
1093	out_stream = stdout;
1094      else
1095	out_stream = fopen (out_fname, "w");
1096
1097      if (out_stream == NULL)
1098	{
1099	  fatal_error ("opening output file %s: %m", out_fname);
1100	  return false;
1101	}
1102
1103      if (num_in_fnames > 1)
1104	error ("too many filenames given.  Type %s --help for usage",
1105	       progname);
1106
1107      init_pp_output (out_stream);
1108    }
1109  else
1110    {
1111      init_c_lex ();
1112
1113      /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
1114      input_location = UNKNOWN_LOCATION;
1115    }
1116
1117  cb = cpp_get_callbacks (parse_in);
1118  cb->file_change = cb_file_change;
1119  cb->dir_change = cb_dir_change;
1120  cpp_post_options (parse_in);
1121
1122  input_location = UNKNOWN_LOCATION;
1123
1124  /* If an error has occurred in cpplib, note it so we fail
1125     immediately.  */
1126  errorcount += cpp_errors (parse_in);
1127
1128  *pfilename = this_input_filename
1129    = cpp_read_main_file (parse_in, in_fnames[0]);
1130  /* Don't do any compilation or preprocessing if there is no input file.  */
1131  if (this_input_filename == NULL)
1132    {
1133      errorcount++;
1134      return false;
1135    }
1136
1137  if (flag_working_directory
1138      && flag_preprocess_only && !flag_no_line_commands)
1139    pp_dir_change (parse_in, get_src_pwd ());
1140
1141  return flag_preprocess_only;
1142}
1143
1144/* Front end initialization common to C, ObjC and C++.  */
1145bool
1146c_common_init (void)
1147{
1148  /* Set up preprocessor arithmetic.  Must be done after call to
1149     c_common_nodes_and_builtins for type nodes to be good.  */
1150  cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1151  cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1152  cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1153  cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1154  cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1155  cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1156
1157  /* This can't happen until after wchar_precision and bytes_big_endian
1158     are known.  */
1159  cpp_init_iconv (parse_in);
1160
1161  if (version_flag)
1162    c_common_print_pch_checksum (stderr);
1163
1164  if (flag_preprocess_only)
1165    {
1166      finish_options ();
1167      preprocess_file (parse_in);
1168      return false;
1169    }
1170
1171  /* Has to wait until now so that cpplib has its hash table.  */
1172  init_pragma ();
1173
1174  return true;
1175}
1176
1177/* Initialize the integrated preprocessor after debug output has been
1178   initialized; loop over each input file.  */
1179void
1180c_common_parse_file (int set_yydebug)
1181{
1182  unsigned int i;
1183
1184  /* Enable parser debugging, if requested and we can.  If requested
1185     and we can't, notify the user.  */
1186#if YYDEBUG != 0
1187  yydebug = set_yydebug;
1188#else
1189  if (set_yydebug)
1190    warning (0, "YYDEBUG was not defined at build time, -dy ignored");
1191#endif
1192
1193  i = 0;
1194  for (;;)
1195    {
1196      /* Start the main input file, if the debug writer wants it. */
1197      if (debug_hooks->start_end_main_source_file)
1198	(*debug_hooks->start_source_file) (0, this_input_filename);
1199      finish_options ();
1200      pch_init ();
1201      push_file_scope ();
1202      c_parse_file ();
1203      finish_file ();
1204      pop_file_scope ();
1205      /* And end the main input file, if the debug writer wants it  */
1206      if (debug_hooks->start_end_main_source_file)
1207	(*debug_hooks->end_source_file) (0);
1208      if (++i >= num_in_fnames)
1209	break;
1210      cpp_undef_all (parse_in);
1211      this_input_filename
1212	= cpp_read_main_file (parse_in, in_fnames[i]);
1213      /* If an input file is missing, abandon further compilation.
1214	 cpplib has issued a diagnostic.  */
1215      if (!this_input_filename)
1216	break;
1217    }
1218}
1219
1220/* Common finish hook for the C, ObjC and C++ front ends.  */
1221void
1222c_common_finish (void)
1223{
1224  FILE *deps_stream = NULL;
1225
1226  if (cpp_opts->deps.style != DEPS_NONE)
1227    {
1228      /* If -M or -MM was seen without -MF, default output to the
1229	 output stream.  */
1230      if (!deps_file)
1231	deps_stream = out_stream;
1232      else
1233	{
1234	  deps_stream = fopen (deps_file, deps_append ? "a": "w");
1235	  if (!deps_stream)
1236	    fatal_error ("opening dependency file %s: %m", deps_file);
1237	}
1238    }
1239
1240  /* For performance, avoid tearing down cpplib's internal structures
1241     with cpp_destroy ().  */
1242  errorcount += cpp_finish (parse_in, deps_stream);
1243
1244  if (deps_stream && deps_stream != out_stream
1245      && (ferror (deps_stream) || fclose (deps_stream)))
1246    fatal_error ("closing dependency file %s: %m", deps_file);
1247
1248  if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1249    fatal_error ("when writing output to %s: %m", out_fname);
1250}
1251
1252/* Either of two environment variables can specify output of
1253   dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1254   DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1255   and DEPS_TARGET is the target to mention in the deps.  They also
1256   result in dependency information being appended to the output file
1257   rather than overwriting it, and like Sun's compiler
1258   SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
1259static void
1260check_deps_environment_vars (void)
1261{
1262  char *spec;
1263
1264  GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1265  if (spec)
1266    cpp_opts->deps.style = DEPS_USER;
1267  else
1268    {
1269      GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1270      if (spec)
1271	{
1272	  cpp_opts->deps.style = DEPS_SYSTEM;
1273	  cpp_opts->deps.ignore_main_file = true;
1274	}
1275    }
1276
1277  if (spec)
1278    {
1279      /* Find the space before the DEPS_TARGET, if there is one.  */
1280      char *s = strchr (spec, ' ');
1281      if (s)
1282	{
1283	  /* Let the caller perform MAKE quoting.  */
1284	  defer_opt (OPT_MT, s + 1);
1285	  *s = '\0';
1286	}
1287
1288      /* Command line -MF overrides environment variables and default.  */
1289      if (!deps_file)
1290	deps_file = spec;
1291
1292      deps_append = 1;
1293      deps_seen = true;
1294    }
1295}
1296
1297/* Handle deferred command line switches.  */
1298static void
1299handle_deferred_opts (void)
1300{
1301  size_t i;
1302  struct deps *deps;
1303
1304  /* Avoid allocating the deps buffer if we don't need it.
1305     (This flag may be true without there having been -MT or -MQ
1306     options, but we'll still need the deps buffer.)  */
1307  if (!deps_seen)
1308    return;
1309
1310  deps = cpp_get_deps (parse_in);
1311
1312  for (i = 0; i < deferred_count; i++)
1313    {
1314      struct deferred_opt *opt = &deferred_opts[i];
1315
1316      if (opt->code == OPT_MT || opt->code == OPT_MQ)
1317	deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1318    }
1319}
1320
1321/* These settings are appropriate for GCC, but not necessarily so for
1322   cpplib as a library.  */
1323static void
1324sanitize_cpp_opts (void)
1325{
1326  /* If we don't know what style of dependencies to output, complain
1327     if any other dependency switches have been given.  */
1328  if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1329    error ("to generate dependencies you must specify either -M or -MM");
1330
1331  /* -dM and dependencies suppress normal output; do it here so that
1332     the last -d[MDN] switch overrides earlier ones.  */
1333  if (flag_dump_macros == 'M')
1334    flag_no_output = 1;
1335
1336  /* By default, -fdirectives-only implies -dD.  This allows subsequent phases
1337     to perform proper macro expansion.  */
1338  if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
1339    flag_dump_macros = 'D';
1340
1341  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
1342     -dM since at least glibc relies on -M -dM to work.  */
1343  /* Also, flag_no_output implies flag_no_line_commands, always.  */
1344  if (flag_no_output)
1345    {
1346      if (flag_dump_macros != 'M')
1347	flag_dump_macros = 0;
1348      flag_dump_includes = 0;
1349      flag_no_line_commands = 1;
1350    }
1351
1352  cpp_opts->unsigned_char = !flag_signed_char;
1353  cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1354
1355  /* We want -Wno-long-long to override -pedantic -std=non-c99
1356     and/or -Wtraditional, whatever the ordering.  */
1357  cpp_opts->warn_long_long
1358    = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1359
1360  /* Similarly with -Wno-variadic-macros.  No check for c99 here, since
1361     this also turns off warnings about GCCs extension.  */
1362  cpp_opts->warn_variadic_macros
1363    = warn_variadic_macros && (pedantic || warn_traditional);
1364
1365  /* If we're generating preprocessor output, emit current directory
1366     if explicitly requested or if debugging information is enabled.
1367     ??? Maybe we should only do it for debugging formats that
1368     actually output the current directory?  */
1369  if (flag_working_directory == -1)
1370    flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1371
1372  if (cpp_opts->directives_only)
1373    {
1374      if (warn_unused_macros)
1375	error ("-fdirectives-only is incompatible with -Wunused_macros");
1376      if (cpp_opts->traditional)
1377	error ("-fdirectives-only is incompatible with -traditional");
1378    }
1379}
1380
1381/* Add include path with a prefix at the front of its name.  */
1382static void
1383add_prefixed_path (const char *suffix, size_t chain)
1384{
1385  char *path;
1386  const char *prefix;
1387  size_t prefix_len, suffix_len;
1388
1389  suffix_len = strlen (suffix);
1390  prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1391  prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1392
1393  path = (char *) xmalloc (prefix_len + suffix_len + 1);
1394  memcpy (path, prefix, prefix_len);
1395  memcpy (path + prefix_len, suffix, suffix_len);
1396  path[prefix_len + suffix_len] = '\0';
1397
1398  add_path (path, chain, 0, false);
1399}
1400
1401/* Handle -D, -U, -A, -imacros, and the first -include.  */
1402static void
1403finish_options (void)
1404{
1405  if (!cpp_opts->preprocessed)
1406    {
1407      size_t i;
1408
1409      cb_file_change (parse_in,
1410		      linemap_add (&line_table, LC_RENAME, 0,
1411				   _("<built-in>"), 0));
1412
1413      cpp_init_builtins (parse_in, flag_hosted);
1414      c_cpp_builtins (parse_in);
1415
1416      /* We're about to send user input to cpplib, so make it warn for
1417	 things that we previously (when we sent it internal definitions)
1418	 told it to not warn.
1419
1420	 C99 permits implementation-defined characters in identifiers.
1421	 The documented meaning of -std= is to turn off extensions that
1422	 conflict with the specified standard, and since a strictly
1423	 conforming program cannot contain a '$', we do not condition
1424	 their acceptance on the -std= setting.  */
1425      cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1426
1427      cb_file_change (parse_in,
1428		      linemap_add (&line_table, LC_RENAME, 0,
1429				   _("<command-line>"), 0));
1430
1431      for (i = 0; i < deferred_count; i++)
1432	{
1433	  struct deferred_opt *opt = &deferred_opts[i];
1434
1435	  if (opt->code == OPT_D)
1436	    cpp_define (parse_in, opt->arg);
1437	  else if (opt->code == OPT_U)
1438	    cpp_undef (parse_in, opt->arg);
1439	  else if (opt->code == OPT_A)
1440	    {
1441	      if (opt->arg[0] == '-')
1442		cpp_unassert (parse_in, opt->arg + 1);
1443	      else
1444		cpp_assert (parse_in, opt->arg);
1445	    }
1446	}
1447
1448      /* Handle -imacros after -D and -U.  */
1449      for (i = 0; i < deferred_count; i++)
1450	{
1451	  struct deferred_opt *opt = &deferred_opts[i];
1452
1453	  if (opt->code == OPT_imacros
1454	      && cpp_push_include (parse_in, opt->arg))
1455	    {
1456	      /* Disable push_command_line_include callback for now.  */
1457	      include_cursor = deferred_count + 1;
1458	      cpp_scan_nooutput (parse_in);
1459	    }
1460	}
1461    }
1462  else if (cpp_opts->directives_only)
1463    cpp_init_special_builtins (parse_in);
1464
1465  include_cursor = 0;
1466  push_command_line_include ();
1467}
1468
1469/* Give CPP the next file given by -include, if any.  */
1470static void
1471push_command_line_include (void)
1472{
1473  while (include_cursor < deferred_count)
1474    {
1475      struct deferred_opt *opt = &deferred_opts[include_cursor++];
1476
1477      if (!cpp_opts->preprocessed && opt->code == OPT_include
1478	  && cpp_push_include (parse_in, opt->arg))
1479	return;
1480    }
1481
1482  if (include_cursor == deferred_count)
1483    {
1484      include_cursor++;
1485      /* -Wunused-macros should only warn about macros defined hereafter.  */
1486      cpp_opts->warn_unused_macros = warn_unused_macros;
1487      /* Restore the line map from <command line>.  */
1488      if (!cpp_opts->preprocessed)
1489	cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1490
1491      /* Set this here so the client can change the option if it wishes,
1492	 and after stacking the main file so we don't trace the main file.  */
1493      line_table.trace_includes = cpp_opts->print_include_names;
1494    }
1495}
1496
1497/* File change callback.  Has to handle -include files.  */
1498static void
1499cb_file_change (cpp_reader * ARG_UNUSED (pfile),
1500		const struct line_map *new_map)
1501{
1502  if (flag_preprocess_only)
1503    pp_file_change (new_map);
1504  else
1505    fe_file_change (new_map);
1506
1507  if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1508    push_command_line_include ();
1509}
1510
1511void
1512cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1513{
1514  if (!set_src_pwd (dir))
1515    warning (0, "too late for # directive to set debug directory");
1516}
1517
1518/* Set the C 89 standard (with 1994 amendments if C94, without GNU
1519   extensions if ISO).  There is no concept of gnu94.  */
1520static void
1521set_std_c89 (int c94, int iso)
1522{
1523  cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1524  flag_iso = iso;
1525  flag_no_asm = iso;
1526  flag_no_gnu_keywords = iso;
1527  flag_no_nonansi_builtin = iso;
1528  flag_isoc94 = c94;
1529  flag_isoc99 = 0;
1530}
1531
1532/* Set the C 99 standard (without GNU extensions if ISO).  */
1533static void
1534set_std_c99 (int iso)
1535{
1536  cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1537  flag_no_asm = iso;
1538  flag_no_nonansi_builtin = iso;
1539  flag_iso = iso;
1540  flag_isoc99 = 1;
1541  flag_isoc94 = 1;
1542}
1543
1544/* Set the C++ 98 standard (without GNU extensions if ISO).  */
1545static void
1546set_std_cxx98 (int iso)
1547{
1548  cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1549  flag_no_gnu_keywords = iso;
1550  flag_no_nonansi_builtin = iso;
1551  flag_iso = iso;
1552}
1553
1554/* Handle setting implicit to ON.  */
1555static void
1556set_Wimplicit (int on)
1557{
1558  warn_implicit = on;
1559  warn_implicit_int = on;
1560  if (on)
1561    {
1562      if (mesg_implicit_function_declaration != 2)
1563	mesg_implicit_function_declaration = 1;
1564    }
1565  else
1566    mesg_implicit_function_declaration = 0;
1567}
1568
1569/* Args to -d specify what to dump.  Silently ignore
1570   unrecognized options; they may be aimed at toplev.c.  */
1571static void
1572handle_OPT_d (const char *arg)
1573{
1574  char c;
1575
1576  while ((c = *arg++) != '\0')
1577    switch (c)
1578      {
1579      case 'M':			/* Dump macros only.  */
1580      case 'N':			/* Dump names.  */
1581      case 'D':			/* Dump definitions.  */
1582	flag_dump_macros = c;
1583	break;
1584
1585      case 'I':
1586	flag_dump_includes = 1;
1587	break;
1588      }
1589}
1590