c-opts.c revision 260568
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 260568 2014-01-12 20:09:17Z 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      /* APPLE LOCAL -Wmost */
389    case OPT_Wmost:
390      set_Wunused (value);
391      set_Wformat (value);
392      set_Wimplicit (value);
393      warn_char_subscripts = value;
394      warn_missing_braces = value;
395      /* APPLE LOCAL begin -Wmost --dpatel */
396      if (code != OPT_Wmost)
397	warn_parentheses = value;
398      /* APPLE LOCAL end -Wmost --dpatel */
399      warn_return_type = value;
400      warn_sequence_point = value;	/* Was C only.  */
401      if (c_dialect_cxx ())
402	warn_sign_compare = value;
403      warn_switch = value;
404      set_warn_strict_aliasing (value);
405      warn_strict_overflow = value;
406      warn_address = value;
407
408      /* Only warn about unknown pragmas that are not in system
409	 headers.  */
410      warn_unknown_pragmas = value;
411
412      /* We save the value of warn_uninitialized, since if they put
413	 -Wuninitialized on the command line, we need to generate a
414	 warning about not using it without also specifying -O.  */
415      if (warn_uninitialized != 1)
416	warn_uninitialized = (value ? 2 : 0);
417
418      if (!c_dialect_cxx ())
419	/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
420	   can turn it off only if it's not explicit.  */
421	warn_main = value * 2;
422      else
423	{
424	  /* C++-specific warnings.  */
425	  warn_reorder = value;
426	  warn_nontemplate_friend = value;
427	}
428
429      cpp_opts->warn_trigraphs = value;
430      cpp_opts->warn_comments = value;
431      cpp_opts->warn_num_sign_change = value;
432      cpp_opts->warn_multichar = value;	/* Was C++ only.  */
433
434      if (warn_pointer_sign == -1)
435	warn_pointer_sign = 1;
436      break;
437
438    case OPT_Wcomment:
439    case OPT_Wcomments:
440      cpp_opts->warn_comments = value;
441      break;
442
443    case OPT_Wdeprecated:
444      cpp_opts->warn_deprecated = value;
445      break;
446
447    case OPT_Wendif_labels:
448      cpp_opts->warn_endif_labels = value;
449      break;
450
451    case OPT_Werror:
452      cpp_opts->warnings_are_errors = value;
453      global_dc->warning_as_error_requested = value;
454      break;
455
456    case OPT_Werror_implicit_function_declaration:
457      mesg_implicit_function_declaration = 2;
458      break;
459
460    case OPT_Wformat:
461      set_Wformat (value);
462      break;
463
464    case OPT_Wformat_:
465      set_Wformat (atoi (arg));
466      break;
467
468    case OPT_Wimplicit:
469      set_Wimplicit (value);
470      break;
471
472    case OPT_Wimport:
473      /* Silently ignore for now.  */
474      break;
475
476    case OPT_Winvalid_pch:
477      cpp_opts->warn_invalid_pch = value;
478      break;
479
480    case OPT_Wmain:
481      if (value)
482	warn_main = 1;
483      else
484	warn_main = -1;
485      break;
486
487    case OPT_Wmissing_include_dirs:
488      cpp_opts->warn_missing_include_dirs = value;
489      break;
490
491    case OPT_Wmultichar:
492      cpp_opts->warn_multichar = value;
493      break;
494
495      /* APPLE LOCAL begin -Wnewline-eof */
496    case OPT_Wnewline_eof:
497      cpp_opts->warn_newline_at_eof = value;
498      break;
499      /* APPLE LOCAL end -Wnewline-eof */
500
501    case OPT_Wnormalized_:
502      if (!value || (arg && strcasecmp (arg, "none") == 0))
503	cpp_opts->warn_normalize = normalized_none;
504      else if (!arg || strcasecmp (arg, "nfkc") == 0)
505	cpp_opts->warn_normalize = normalized_KC;
506      else if (strcasecmp (arg, "id") == 0)
507	cpp_opts->warn_normalize = normalized_identifier_C;
508      else if (strcasecmp (arg, "nfc") == 0)
509	cpp_opts->warn_normalize = normalized_C;
510      else
511	error ("argument %qs to %<-Wnormalized%> not recognized", arg);
512      break;
513
514    case OPT_Wreturn_type:
515      warn_return_type = value;
516      break;
517
518    case OPT_Wstrict_null_sentinel:
519      warn_strict_null_sentinel = value;
520      break;
521
522    case OPT_Wsystem_headers:
523      cpp_opts->warn_system_headers = value;
524      break;
525
526    case OPT_Wtraditional:
527      cpp_opts->warn_traditional = value;
528      break;
529
530    case OPT_Wtrigraphs:
531      cpp_opts->warn_trigraphs = value;
532      break;
533
534    case OPT_Wundef:
535      cpp_opts->warn_undef = value;
536      break;
537
538    case OPT_Wunknown_pragmas:
539      /* Set to greater than 1, so that even unknown pragmas in
540	 system headers will be warned about.  */
541      warn_unknown_pragmas = value * 2;
542      break;
543
544    case OPT_Wunused_macros:
545      warn_unused_macros = value;
546      break;
547
548    case OPT_Wvariadic_macros:
549      warn_variadic_macros = value;
550      break;
551
552    case OPT_Wwrite_strings:
553      warn_write_strings = value;
554      break;
555
556    case OPT_Weffc__:
557      warn_ecpp = value;
558      if (value)
559        warn_nonvdtor = true;
560      break;
561
562    case OPT_ansi:
563      if (!c_dialect_cxx ())
564	set_std_c89 (false, true);
565      else
566	set_std_cxx98 (true);
567      break;
568
569    case OPT_d:
570      handle_OPT_d (arg);
571      break;
572
573    case OPT_fcond_mismatch:
574      if (!c_dialect_cxx ())
575	{
576	  flag_cond_mismatch = value;
577	  break;
578	}
579      /* Fall through.  */
580
581    case OPT_fall_virtual:
582    case OPT_falt_external_templates:
583    case OPT_fenum_int_equiv:
584    case OPT_fexternal_templates:
585    case OPT_fguiding_decls:
586    case OPT_fhonor_std:
587    case OPT_fhuge_objects:
588    case OPT_flabels_ok:
589    case OPT_fname_mangling_version_:
590    case OPT_fnew_abi:
591    case OPT_fnonnull_objects:
592    case OPT_fsquangle:
593    case OPT_fstrict_prototype:
594    case OPT_fthis_is_variable:
595    case OPT_fvtable_thunks:
596    case OPT_fxref:
597    case OPT_fvtable_gc:
598      warning (0, "switch %qs is no longer supported", option->opt_text);
599      break;
600
601    case OPT_faccess_control:
602      flag_access_control = value;
603      break;
604
605    case OPT_fasm:
606      flag_no_asm = !value;
607      break;
608
609    case OPT_fbuiltin:
610      flag_no_builtin = !value;
611      break;
612
613    case OPT_fbuiltin_:
614      if (value)
615	result = 0;
616      else
617	disable_builtin_function (arg);
618      break;
619
620    case OPT_fdirectives_only:
621      cpp_opts->directives_only = 1;
622      break;
623
624    case OPT_fdollars_in_identifiers:
625      cpp_opts->dollars_in_ident = value;
626      break;
627
628    case OPT_ffreestanding:
629      value = !value;
630      /* Fall through....  */
631    case OPT_fhosted:
632      flag_hosted = value;
633      flag_no_builtin = !value;
634      /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
635      if (!value && warn_main == 2)
636	warn_main = 0;
637      break;
638
639    case OPT_fshort_double:
640      flag_short_double = value;
641      break;
642
643    case OPT_fshort_enums:
644      flag_short_enums = value;
645      break;
646
647    case OPT_fshort_wchar:
648      flag_short_wchar = value;
649      break;
650
651    case OPT_fsigned_bitfields:
652      flag_signed_bitfields = value;
653      break;
654
655    case OPT_fsigned_char:
656      flag_signed_char = value;
657      break;
658
659    case OPT_funsigned_bitfields:
660      flag_signed_bitfields = !value;
661      break;
662
663    case OPT_funsigned_char:
664      flag_signed_char = !value;
665      break;
666
667    case OPT_fcheck_new:
668      flag_check_new = value;
669      break;
670
671    case OPT_fconserve_space:
672      flag_conserve_space = value;
673      break;
674
675    case OPT_fconstant_string_class_:
676      constant_string_class_name = arg;
677      break;
678
679    case OPT_fdefault_inline:
680      flag_default_inline = value;
681      break;
682
683    case OPT_felide_constructors:
684      flag_elide_constructors = value;
685      break;
686
687    case OPT_fenforce_eh_specs:
688      flag_enforce_eh_specs = value;
689      break;
690
691    case OPT_fextended_identifiers:
692      cpp_opts->extended_identifiers = value;
693      break;
694
695    case OPT_ffor_scope:
696      flag_new_for_scope = value;
697      break;
698
699    case OPT_fgnu_keywords:
700      flag_no_gnu_keywords = !value;
701      break;
702
703    case OPT_fgnu_runtime:
704      flag_next_runtime = !value;
705      break;
706
707    case OPT_fhandle_exceptions:
708      warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
709      flag_exceptions = value;
710      break;
711
712    case OPT_fimplement_inlines:
713      flag_implement_inlines = value;
714      break;
715
716    case OPT_fimplicit_inline_templates:
717      flag_implicit_inline_templates = value;
718      break;
719
720    case OPT_fimplicit_templates:
721      flag_implicit_templates = value;
722      break;
723
724    case OPT_flax_vector_conversions:
725      flag_lax_vector_conversions = value;
726      break;
727
728    case OPT_fms_extensions:
729      flag_ms_extensions = value;
730      break;
731
732    case OPT_fnext_runtime:
733      flag_next_runtime = value;
734      break;
735
736    case OPT_fnil_receivers:
737      flag_nil_receivers = value;
738      break;
739
740    case OPT_fnonansi_builtins:
741      flag_no_nonansi_builtin = !value;
742      break;
743
744    case OPT_foperator_names:
745      cpp_opts->operator_names = value;
746      break;
747
748    case OPT_foptional_diags:
749      flag_optional_diags = value;
750      break;
751
752    case OPT_fpch_deps:
753      cpp_opts->restore_pch_deps = value;
754      break;
755
756    case OPT_fpch_preprocess:
757      flag_pch_preprocess = value;
758      break;
759
760    case OPT_fpermissive:
761      flag_permissive = value;
762      break;
763
764    case OPT_fpreprocessed:
765      cpp_opts->preprocessed = value;
766      break;
767
768    case OPT_freplace_objc_classes:
769      flag_replace_objc_classes = value;
770      break;
771
772    case OPT_frepo:
773      flag_use_repository = value;
774      if (value)
775	flag_implicit_templates = 0;
776      break;
777
778    case OPT_frtti:
779      flag_rtti = value;
780      break;
781
782    case OPT_fshow_column:
783      cpp_opts->show_column = value;
784      break;
785
786    case OPT_fstats:
787      flag_detailed_statistics = value;
788      break;
789
790    case OPT_ftabstop_:
791      /* It is documented that we silently ignore silly values.  */
792      if (value >= 1 && value <= 100)
793	cpp_opts->tabstop = value;
794      break;
795
796    case OPT_fexec_charset_:
797      cpp_opts->narrow_charset = arg;
798      break;
799
800    case OPT_fwide_exec_charset_:
801      cpp_opts->wide_charset = arg;
802      break;
803
804    case OPT_finput_charset_:
805      cpp_opts->input_charset = arg;
806      break;
807
808    case OPT_ftemplate_depth_:
809      max_tinst_depth = value;
810      break;
811
812    case OPT_fuse_cxa_atexit:
813      flag_use_cxa_atexit = value;
814      break;
815
816    case OPT_fuse_cxa_get_exception_ptr:
817      flag_use_cxa_get_exception_ptr = value;
818      break;
819
820    case OPT_fvisibility_inlines_hidden:
821      visibility_options.inlines_hidden = value;
822      break;
823
824    case OPT_fweak:
825      flag_weak = value;
826      break;
827
828    case OPT_fthreadsafe_statics:
829      flag_threadsafe_statics = value;
830      break;
831
832    case OPT_fzero_link:
833      flag_zero_link = value;
834      break;
835
836    case OPT_gen_decls:
837      flag_gen_declaration = 1;
838      break;
839
840    case OPT_femit_struct_debug_baseonly:
841      set_struct_debug_option ("base");
842      break;
843
844    case OPT_femit_struct_debug_reduced:
845      set_struct_debug_option ("dir:ord:sys,dir:gen:any,ind:base");
846      break;
847
848    case OPT_femit_struct_debug_detailed_:
849      set_struct_debug_option (arg);
850      break;
851
852    case OPT_idirafter:
853      add_path (xstrdup (arg), AFTER, 0, true);
854      break;
855
856    case OPT_imacros:
857    case OPT_include:
858      defer_opt (code, arg);
859      break;
860
861    case OPT_imultilib:
862      imultilib = arg;
863      break;
864
865    case OPT_iprefix:
866      iprefix = arg;
867      break;
868
869    case OPT_iquote:
870      add_path (xstrdup (arg), QUOTE, 0, true);
871      break;
872
873    case OPT_isysroot:
874      sysroot = arg;
875      break;
876
877    case OPT_isystem:
878      add_path (xstrdup (arg), SYSTEM, 0, true);
879      break;
880
881    case OPT_iwithprefix:
882      add_prefixed_path (arg, SYSTEM);
883      break;
884
885    case OPT_iwithprefixbefore:
886      add_prefixed_path (arg, BRACKET);
887      break;
888
889    case OPT_lang_asm:
890      cpp_set_lang (parse_in, CLK_ASM);
891      cpp_opts->dollars_in_ident = false;
892      break;
893
894    case OPT_lang_fortran:
895      lang_fortran = true;
896      break;
897
898    case OPT_lang_objc:
899      cpp_opts->objc = 1;
900      break;
901
902    case OPT_nostdinc:
903      std_inc = false;
904      break;
905
906    case OPT_nostdinc__:
907      std_cxx_inc = false;
908      break;
909
910    case OPT_o:
911      if (!out_fname)
912	out_fname = arg;
913      else
914	error ("output filename specified twice");
915      break;
916
917      /* We need to handle the -pedantic switches here, rather than in
918	 c_common_post_options, so that a subsequent -Wno-endif-labels
919	 is not overridden.  */
920    case OPT_pedantic_errors:
921      cpp_opts->pedantic_errors = 1;
922      /* Fall through.  */
923    case OPT_pedantic:
924      cpp_opts->pedantic = 1;
925      cpp_opts->warn_endif_labels = 1;
926      if (warn_pointer_sign == -1)
927	warn_pointer_sign = 1;
928      if (warn_overlength_strings == -1)
929	warn_overlength_strings = 1;
930      break;
931
932    case OPT_print_objc_runtime_info:
933      print_struct_values = 1;
934      break;
935
936    case OPT_print_pch_checksum:
937      c_common_print_pch_checksum (stdout);
938      exit_after_options = true;
939      break;
940
941    case OPT_remap:
942      cpp_opts->remap = 1;
943      break;
944
945    case OPT_std_c__98:
946    case OPT_std_gnu__98:
947      if (!preprocessing_asm_p)
948	set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
949      break;
950
951    case OPT_std_c89:
952    case OPT_std_iso9899_1990:
953    case OPT_std_iso9899_199409:
954      if (!preprocessing_asm_p)
955	set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
956      break;
957
958    case OPT_std_gnu89:
959      if (!preprocessing_asm_p)
960	set_std_c89 (false /* c94 */, false /* ISO */);
961      break;
962
963    case OPT_std_c99:
964    case OPT_std_c9x:
965    case OPT_std_iso9899_1999:
966    case OPT_std_iso9899_199x:
967      if (!preprocessing_asm_p)
968	set_std_c99 (true /* ISO */);
969      break;
970
971    case OPT_std_gnu99:
972    case OPT_std_gnu9x:
973      if (!preprocessing_asm_p)
974	set_std_c99 (false /* ISO */);
975      break;
976
977    case OPT_trigraphs:
978      cpp_opts->trigraphs = 1;
979      break;
980
981    case OPT_traditional_cpp:
982      cpp_opts->traditional = 1;
983      break;
984
985    case OPT_undef:
986      flag_undef = 1;
987      break;
988
989    case OPT_w:
990      cpp_opts->inhibit_warnings = 1;
991      break;
992
993    case OPT_v:
994      verbose = true;
995      break;
996    }
997
998  return result;
999}
1000
1001/* Post-switch processing.  */
1002bool
1003c_common_post_options (const char **pfilename)
1004{
1005  struct cpp_callbacks *cb;
1006
1007  /* Canonicalize the input and output filenames.  */
1008  if (in_fnames == NULL)
1009    {
1010      in_fnames = XNEWVEC (const char *, 1);
1011      in_fnames[0] = "";
1012    }
1013  else if (strcmp (in_fnames[0], "-") == 0)
1014    in_fnames[0] = "";
1015
1016  if (out_fname == NULL || !strcmp (out_fname, "-"))
1017    out_fname = "";
1018
1019  if (cpp_opts->deps.style == DEPS_NONE)
1020    check_deps_environment_vars ();
1021
1022  handle_deferred_opts ();
1023
1024  sanitize_cpp_opts ();
1025
1026  register_include_chains (parse_in, sysroot, iprefix, imultilib,
1027			   std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1028
1029#ifdef C_COMMON_OVERRIDE_OPTIONS
1030  /* Some machines may reject certain combinations of C
1031     language-specific options.  */
1032  C_COMMON_OVERRIDE_OPTIONS;
1033#endif
1034
1035  flag_inline_trees = 1;
1036
1037  /* Use tree inlining.  */
1038  if (!flag_no_inline)
1039    flag_no_inline = 1;
1040  if (flag_inline_functions)
1041    flag_inline_trees = 2;
1042
1043  /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
1044     inline semantics are not supported in GNU89 or C89 mode.  */
1045  if (flag_gnu89_inline == -1)
1046    flag_gnu89_inline = !flag_isoc99;
1047  else if (!flag_gnu89_inline && !flag_isoc99)
1048    error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
1049
1050  /* If we are given more than one input file, we must use
1051     unit-at-a-time mode.  */
1052  if (num_in_fnames > 1)
1053    flag_unit_at_a_time = 1;
1054
1055  /* Default to ObjC sjlj exception handling if NeXT runtime.  */
1056  if (flag_objc_sjlj_exceptions < 0)
1057    flag_objc_sjlj_exceptions = flag_next_runtime;
1058  if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
1059    flag_exceptions = 1;
1060
1061  /* -Wextra implies -Wsign-compare, -Wmissing-field-initializers and
1062     -Woverride-init, but not if explicitly overridden.  */
1063  if (warn_sign_compare == -1)
1064    warn_sign_compare = extra_warnings;
1065  if (warn_missing_field_initializers == -1)
1066    warn_missing_field_initializers = extra_warnings;
1067  if (warn_override_init == -1)
1068    warn_override_init = extra_warnings;
1069
1070  /* -Wpointer_sign is disabled by default, but it is enabled if any
1071     of -Wall or -pedantic are given.  */
1072  if (warn_pointer_sign == -1)
1073    warn_pointer_sign = 0;
1074
1075  /* -Woverlength-strings is off by default, but is enabled by -pedantic.
1076     It is never enabled in C++, as the minimum limit is not normative
1077     in that standard.  */
1078  if (warn_overlength_strings == -1 || c_dialect_cxx ())
1079    warn_overlength_strings = 0;
1080
1081  /* Special format checking options don't work without -Wformat; warn if
1082     they are used.  */
1083  if (!warn_format)
1084    {
1085      warning (OPT_Wformat_y2k,
1086	       "-Wformat-y2k ignored without -Wformat");
1087      warning (OPT_Wformat_extra_args,
1088	       "-Wformat-extra-args ignored without -Wformat");
1089      warning (OPT_Wformat_zero_length,
1090	       "-Wformat-zero-length ignored without -Wformat");
1091      warning (OPT_Wformat_nonliteral,
1092	       "-Wformat-nonliteral ignored without -Wformat");
1093      warning (OPT_Wformat_security,
1094	       "-Wformat-security ignored without -Wformat");
1095    }
1096
1097  /* C99 requires special handling of complex multiplication and division;
1098     -ffast-math and -fcx-limited-range are handled in process_options.  */
1099  if (flag_isoc99)
1100    flag_complex_method = 2;
1101
1102  if (flag_preprocess_only)
1103    {
1104      /* Open the output now.  We must do so even if flag_no_output is
1105	 on, because there may be other output than from the actual
1106	 preprocessing (e.g. from -dM).  */
1107      if (out_fname[0] == '\0')
1108	out_stream = stdout;
1109      else
1110	out_stream = fopen (out_fname, "w");
1111
1112      if (out_stream == NULL)
1113	{
1114	  fatal_error ("opening output file %s: %m", out_fname);
1115	  return false;
1116	}
1117
1118      if (num_in_fnames > 1)
1119	error ("too many filenames given.  Type %s --help for usage",
1120	       progname);
1121
1122      init_pp_output (out_stream);
1123    }
1124  else
1125    {
1126      init_c_lex ();
1127
1128      /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
1129      input_location = UNKNOWN_LOCATION;
1130    }
1131
1132  cb = cpp_get_callbacks (parse_in);
1133  cb->file_change = cb_file_change;
1134  cb->dir_change = cb_dir_change;
1135  cpp_post_options (parse_in);
1136
1137  input_location = UNKNOWN_LOCATION;
1138
1139  /* If an error has occurred in cpplib, note it so we fail
1140     immediately.  */
1141  errorcount += cpp_errors (parse_in);
1142
1143  *pfilename = this_input_filename
1144    = cpp_read_main_file (parse_in, in_fnames[0]);
1145  /* Don't do any compilation or preprocessing if there is no input file.  */
1146  if (this_input_filename == NULL)
1147    {
1148      errorcount++;
1149      return false;
1150    }
1151
1152  if (flag_working_directory
1153      && flag_preprocess_only && !flag_no_line_commands)
1154    pp_dir_change (parse_in, get_src_pwd ());
1155
1156  return flag_preprocess_only;
1157}
1158
1159/* Front end initialization common to C, ObjC and C++.  */
1160bool
1161c_common_init (void)
1162{
1163  /* Set up preprocessor arithmetic.  Must be done after call to
1164     c_common_nodes_and_builtins for type nodes to be good.  */
1165  cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1166  cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1167  cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1168  cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1169  cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1170  cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1171
1172  /* This can't happen until after wchar_precision and bytes_big_endian
1173     are known.  */
1174  cpp_init_iconv (parse_in);
1175
1176  if (version_flag)
1177    c_common_print_pch_checksum (stderr);
1178
1179  if (flag_preprocess_only)
1180    {
1181      finish_options ();
1182      preprocess_file (parse_in);
1183      return false;
1184    }
1185
1186  /* Has to wait until now so that cpplib has its hash table.  */
1187  init_pragma ();
1188
1189  return true;
1190}
1191
1192/* Initialize the integrated preprocessor after debug output has been
1193   initialized; loop over each input file.  */
1194void
1195c_common_parse_file (int set_yydebug)
1196{
1197  unsigned int i;
1198
1199  /* Enable parser debugging, if requested and we can.  If requested
1200     and we can't, notify the user.  */
1201#if YYDEBUG != 0
1202  yydebug = set_yydebug;
1203#else
1204  if (set_yydebug)
1205    warning (0, "YYDEBUG was not defined at build time, -dy ignored");
1206#endif
1207
1208  i = 0;
1209  for (;;)
1210    {
1211      /* Start the main input file, if the debug writer wants it. */
1212      if (debug_hooks->start_end_main_source_file)
1213	(*debug_hooks->start_source_file) (0, this_input_filename);
1214      finish_options ();
1215      pch_init ();
1216      push_file_scope ();
1217      c_parse_file ();
1218      finish_file ();
1219      pop_file_scope ();
1220      /* And end the main input file, if the debug writer wants it  */
1221      if (debug_hooks->start_end_main_source_file)
1222	(*debug_hooks->end_source_file) (0);
1223      if (++i >= num_in_fnames)
1224	break;
1225      cpp_undef_all (parse_in);
1226      this_input_filename
1227	= cpp_read_main_file (parse_in, in_fnames[i]);
1228      /* If an input file is missing, abandon further compilation.
1229	 cpplib has issued a diagnostic.  */
1230      if (!this_input_filename)
1231	break;
1232    }
1233}
1234
1235/* Common finish hook for the C, ObjC and C++ front ends.  */
1236void
1237c_common_finish (void)
1238{
1239  FILE *deps_stream = NULL;
1240
1241  if (cpp_opts->deps.style != DEPS_NONE)
1242    {
1243      /* If -M or -MM was seen without -MF, default output to the
1244	 output stream.  */
1245      if (!deps_file)
1246	deps_stream = out_stream;
1247      else
1248	{
1249	  deps_stream = fopen (deps_file, deps_append ? "a": "w");
1250	  if (!deps_stream)
1251	    fatal_error ("opening dependency file %s: %m", deps_file);
1252	}
1253    }
1254
1255  /* For performance, avoid tearing down cpplib's internal structures
1256     with cpp_destroy ().  */
1257  errorcount += cpp_finish (parse_in, deps_stream);
1258
1259  if (deps_stream && deps_stream != out_stream
1260      && (ferror (deps_stream) || fclose (deps_stream)))
1261    fatal_error ("closing dependency file %s: %m", deps_file);
1262
1263  if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1264    fatal_error ("when writing output to %s: %m", out_fname);
1265}
1266
1267/* Either of two environment variables can specify output of
1268   dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1269   DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1270   and DEPS_TARGET is the target to mention in the deps.  They also
1271   result in dependency information being appended to the output file
1272   rather than overwriting it, and like Sun's compiler
1273   SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
1274static void
1275check_deps_environment_vars (void)
1276{
1277  char *spec;
1278
1279  GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1280  if (spec)
1281    cpp_opts->deps.style = DEPS_USER;
1282  else
1283    {
1284      GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1285      if (spec)
1286	{
1287	  cpp_opts->deps.style = DEPS_SYSTEM;
1288	  cpp_opts->deps.ignore_main_file = true;
1289	}
1290    }
1291
1292  if (spec)
1293    {
1294      /* Find the space before the DEPS_TARGET, if there is one.  */
1295      char *s = strchr (spec, ' ');
1296      if (s)
1297	{
1298	  /* Let the caller perform MAKE quoting.  */
1299	  defer_opt (OPT_MT, s + 1);
1300	  *s = '\0';
1301	}
1302
1303      /* Command line -MF overrides environment variables and default.  */
1304      if (!deps_file)
1305	deps_file = spec;
1306
1307      deps_append = 1;
1308      deps_seen = true;
1309    }
1310}
1311
1312/* Handle deferred command line switches.  */
1313static void
1314handle_deferred_opts (void)
1315{
1316  size_t i;
1317  struct deps *deps;
1318
1319  /* Avoid allocating the deps buffer if we don't need it.
1320     (This flag may be true without there having been -MT or -MQ
1321     options, but we'll still need the deps buffer.)  */
1322  if (!deps_seen)
1323    return;
1324
1325  deps = cpp_get_deps (parse_in);
1326
1327  for (i = 0; i < deferred_count; i++)
1328    {
1329      struct deferred_opt *opt = &deferred_opts[i];
1330
1331      if (opt->code == OPT_MT || opt->code == OPT_MQ)
1332	deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1333    }
1334}
1335
1336/* These settings are appropriate for GCC, but not necessarily so for
1337   cpplib as a library.  */
1338static void
1339sanitize_cpp_opts (void)
1340{
1341  /* If we don't know what style of dependencies to output, complain
1342     if any other dependency switches have been given.  */
1343  if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1344    error ("to generate dependencies you must specify either -M or -MM");
1345
1346  /* -dM and dependencies suppress normal output; do it here so that
1347     the last -d[MDN] switch overrides earlier ones.  */
1348  if (flag_dump_macros == 'M')
1349    flag_no_output = 1;
1350
1351  /* By default, -fdirectives-only implies -dD.  This allows subsequent phases
1352     to perform proper macro expansion.  */
1353  if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
1354    flag_dump_macros = 'D';
1355
1356  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
1357     -dM since at least glibc relies on -M -dM to work.  */
1358  /* Also, flag_no_output implies flag_no_line_commands, always.  */
1359  if (flag_no_output)
1360    {
1361      if (flag_dump_macros != 'M')
1362	flag_dump_macros = 0;
1363      flag_dump_includes = 0;
1364      flag_no_line_commands = 1;
1365    }
1366
1367  cpp_opts->unsigned_char = !flag_signed_char;
1368  cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1369
1370  /* We want -Wno-long-long to override -pedantic -std=non-c99
1371     and/or -Wtraditional, whatever the ordering.  */
1372  cpp_opts->warn_long_long
1373    = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1374
1375  /* Similarly with -Wno-variadic-macros.  No check for c99 here, since
1376     this also turns off warnings about GCCs extension.  */
1377  cpp_opts->warn_variadic_macros
1378    = warn_variadic_macros && (pedantic || warn_traditional);
1379
1380  /* If we're generating preprocessor output, emit current directory
1381     if explicitly requested or if debugging information is enabled.
1382     ??? Maybe we should only do it for debugging formats that
1383     actually output the current directory?  */
1384  if (flag_working_directory == -1)
1385    flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1386
1387  if (cpp_opts->directives_only)
1388    {
1389      if (warn_unused_macros)
1390	error ("-fdirectives-only is incompatible with -Wunused_macros");
1391      if (cpp_opts->traditional)
1392	error ("-fdirectives-only is incompatible with -traditional");
1393    }
1394}
1395
1396/* Add include path with a prefix at the front of its name.  */
1397static void
1398add_prefixed_path (const char *suffix, size_t chain)
1399{
1400  char *path;
1401  const char *prefix;
1402  size_t prefix_len, suffix_len;
1403
1404  suffix_len = strlen (suffix);
1405  prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1406  prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1407
1408  path = (char *) xmalloc (prefix_len + suffix_len + 1);
1409  memcpy (path, prefix, prefix_len);
1410  memcpy (path + prefix_len, suffix, suffix_len);
1411  path[prefix_len + suffix_len] = '\0';
1412
1413  add_path (path, chain, 0, false);
1414}
1415
1416/* Handle -D, -U, -A, -imacros, and the first -include.  */
1417static void
1418finish_options (void)
1419{
1420  if (!cpp_opts->preprocessed)
1421    {
1422      size_t i;
1423
1424      cb_file_change (parse_in,
1425		      linemap_add (&line_table, LC_RENAME, 0,
1426				   _("<built-in>"), 0));
1427
1428      cpp_init_builtins (parse_in, flag_hosted);
1429      c_cpp_builtins (parse_in);
1430
1431      /* We're about to send user input to cpplib, so make it warn for
1432	 things that we previously (when we sent it internal definitions)
1433	 told it to not warn.
1434
1435	 C99 permits implementation-defined characters in identifiers.
1436	 The documented meaning of -std= is to turn off extensions that
1437	 conflict with the specified standard, and since a strictly
1438	 conforming program cannot contain a '$', we do not condition
1439	 their acceptance on the -std= setting.  */
1440      cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1441
1442      cb_file_change (parse_in,
1443		      linemap_add (&line_table, LC_RENAME, 0,
1444				   _("<command-line>"), 0));
1445
1446      for (i = 0; i < deferred_count; i++)
1447	{
1448	  struct deferred_opt *opt = &deferred_opts[i];
1449
1450	  if (opt->code == OPT_D)
1451	    cpp_define (parse_in, opt->arg);
1452	  else if (opt->code == OPT_U)
1453	    cpp_undef (parse_in, opt->arg);
1454	  else if (opt->code == OPT_A)
1455	    {
1456	      if (opt->arg[0] == '-')
1457		cpp_unassert (parse_in, opt->arg + 1);
1458	      else
1459		cpp_assert (parse_in, opt->arg);
1460	    }
1461	}
1462
1463      /* Handle -imacros after -D and -U.  */
1464      for (i = 0; i < deferred_count; i++)
1465	{
1466	  struct deferred_opt *opt = &deferred_opts[i];
1467
1468	  if (opt->code == OPT_imacros
1469	      && cpp_push_include (parse_in, opt->arg))
1470	    {
1471	      /* Disable push_command_line_include callback for now.  */
1472	      include_cursor = deferred_count + 1;
1473	      cpp_scan_nooutput (parse_in);
1474	    }
1475	}
1476    }
1477  else if (cpp_opts->directives_only)
1478    cpp_init_special_builtins (parse_in);
1479
1480  include_cursor = 0;
1481  push_command_line_include ();
1482}
1483
1484/* Give CPP the next file given by -include, if any.  */
1485static void
1486push_command_line_include (void)
1487{
1488  while (include_cursor < deferred_count)
1489    {
1490      struct deferred_opt *opt = &deferred_opts[include_cursor++];
1491
1492      if (!cpp_opts->preprocessed && opt->code == OPT_include
1493	  && cpp_push_include (parse_in, opt->arg))
1494	return;
1495    }
1496
1497  if (include_cursor == deferred_count)
1498    {
1499      include_cursor++;
1500      /* -Wunused-macros should only warn about macros defined hereafter.  */
1501      cpp_opts->warn_unused_macros = warn_unused_macros;
1502      /* Restore the line map from <command line>.  */
1503      if (!cpp_opts->preprocessed)
1504	cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1505
1506      /* Set this here so the client can change the option if it wishes,
1507	 and after stacking the main file so we don't trace the main file.  */
1508      line_table.trace_includes = cpp_opts->print_include_names;
1509    }
1510}
1511
1512/* File change callback.  Has to handle -include files.  */
1513static void
1514cb_file_change (cpp_reader * ARG_UNUSED (pfile),
1515		const struct line_map *new_map)
1516{
1517  if (flag_preprocess_only)
1518    pp_file_change (new_map);
1519  else
1520    fe_file_change (new_map);
1521
1522  if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1523    push_command_line_include ();
1524}
1525
1526void
1527cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1528{
1529  if (!set_src_pwd (dir))
1530    warning (0, "too late for # directive to set debug directory");
1531}
1532
1533/* Set the C 89 standard (with 1994 amendments if C94, without GNU
1534   extensions if ISO).  There is no concept of gnu94.  */
1535static void
1536set_std_c89 (int c94, int iso)
1537{
1538  cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1539  flag_iso = iso;
1540  flag_no_asm = iso;
1541  flag_no_gnu_keywords = iso;
1542  flag_no_nonansi_builtin = iso;
1543  flag_isoc94 = c94;
1544  flag_isoc99 = 0;
1545}
1546
1547/* Set the C 99 standard (without GNU extensions if ISO).  */
1548static void
1549set_std_c99 (int iso)
1550{
1551  cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1552  flag_no_asm = iso;
1553  flag_no_nonansi_builtin = iso;
1554  flag_iso = iso;
1555  flag_isoc99 = 1;
1556  flag_isoc94 = 1;
1557}
1558
1559/* Set the C++ 98 standard (without GNU extensions if ISO).  */
1560static void
1561set_std_cxx98 (int iso)
1562{
1563  cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1564  flag_no_gnu_keywords = iso;
1565  flag_no_nonansi_builtin = iso;
1566  flag_iso = iso;
1567}
1568
1569/* Handle setting implicit to ON.  */
1570static void
1571set_Wimplicit (int on)
1572{
1573  warn_implicit = on;
1574  warn_implicit_int = on;
1575  if (on)
1576    {
1577      if (mesg_implicit_function_declaration != 2)
1578	mesg_implicit_function_declaration = 1;
1579    }
1580  else
1581    mesg_implicit_function_declaration = 0;
1582}
1583
1584/* Args to -d specify what to dump.  Silently ignore
1585   unrecognized options; they may be aimed at toplev.c.  */
1586static void
1587handle_OPT_d (const char *arg)
1588{
1589  char c;
1590
1591  while ((c = *arg++) != '\0')
1592    switch (c)
1593      {
1594      case 'M':			/* Dump macros only.  */
1595      case 'N':			/* Dump names.  */
1596      case 'D':			/* Dump definitions.  */
1597	flag_dump_macros = c;
1598	break;
1599
1600      case 'I':
1601	flag_dump_includes = 1;
1602	break;
1603      }
1604}
1605