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$ */
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  /* APPLE LOCAL begin radar 5811887  - radar 6084601 */
1044  /* In all flavors of c99, except for ObjC/ObjC++, blocks are off by default
1045     unless requested via -fblocks. */
1046  if (flag_blocks == -1 && flag_iso && !c_dialect_objc())
1047    flag_blocks = 0;
1048  /* APPLE LOCAL end radar 5811887 - radar 6084601 */
1049
1050  /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
1051     inline semantics are not supported in GNU89 or C89 mode.  */
1052  if (flag_gnu89_inline == -1)
1053    flag_gnu89_inline = !flag_isoc99;
1054  else if (!flag_gnu89_inline && !flag_isoc99)
1055    error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
1056
1057  /* If we are given more than one input file, we must use
1058     unit-at-a-time mode.  */
1059  if (num_in_fnames > 1)
1060    flag_unit_at_a_time = 1;
1061
1062  /* Default to ObjC sjlj exception handling if NeXT runtime.  */
1063  if (flag_objc_sjlj_exceptions < 0)
1064    flag_objc_sjlj_exceptions = flag_next_runtime;
1065  if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
1066    flag_exceptions = 1;
1067
1068  /* -Wextra implies -Wsign-compare, -Wmissing-field-initializers and
1069     -Woverride-init, but not if explicitly overridden.  */
1070  if (warn_sign_compare == -1)
1071    warn_sign_compare = extra_warnings;
1072  if (warn_missing_field_initializers == -1)
1073    warn_missing_field_initializers = extra_warnings;
1074  if (warn_override_init == -1)
1075    warn_override_init = extra_warnings;
1076
1077  /* -Wpointer_sign is disabled by default, but it is enabled if any
1078     of -Wall or -pedantic are given.  */
1079  if (warn_pointer_sign == -1)
1080    warn_pointer_sign = 0;
1081
1082  /* -Woverlength-strings is off by default, but is enabled by -pedantic.
1083     It is never enabled in C++, as the minimum limit is not normative
1084     in that standard.  */
1085  if (warn_overlength_strings == -1 || c_dialect_cxx ())
1086    warn_overlength_strings = 0;
1087
1088  /* Special format checking options don't work without -Wformat; warn if
1089     they are used.  */
1090  if (!warn_format)
1091    {
1092      warning (OPT_Wformat_y2k,
1093	       "-Wformat-y2k ignored without -Wformat");
1094      warning (OPT_Wformat_extra_args,
1095	       "-Wformat-extra-args ignored without -Wformat");
1096      warning (OPT_Wformat_zero_length,
1097	       "-Wformat-zero-length ignored without -Wformat");
1098      warning (OPT_Wformat_nonliteral,
1099	       "-Wformat-nonliteral ignored without -Wformat");
1100      warning (OPT_Wformat_security,
1101	       "-Wformat-security ignored without -Wformat");
1102    }
1103
1104  /* C99 requires special handling of complex multiplication and division;
1105     -ffast-math and -fcx-limited-range are handled in process_options.  */
1106  if (flag_isoc99)
1107    flag_complex_method = 2;
1108
1109  if (flag_preprocess_only)
1110    {
1111      /* Open the output now.  We must do so even if flag_no_output is
1112	 on, because there may be other output than from the actual
1113	 preprocessing (e.g. from -dM).  */
1114      if (out_fname[0] == '\0')
1115	out_stream = stdout;
1116      else
1117	out_stream = fopen (out_fname, "w");
1118
1119      if (out_stream == NULL)
1120	{
1121	  fatal_error ("opening output file %s: %m", out_fname);
1122	  return false;
1123	}
1124
1125      if (num_in_fnames > 1)
1126	error ("too many filenames given.  Type %s --help for usage",
1127	       progname);
1128
1129      init_pp_output (out_stream);
1130    }
1131  else
1132    {
1133      init_c_lex ();
1134
1135      /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
1136      input_location = UNKNOWN_LOCATION;
1137    }
1138
1139  cb = cpp_get_callbacks (parse_in);
1140  cb->file_change = cb_file_change;
1141  cb->dir_change = cb_dir_change;
1142  cpp_post_options (parse_in);
1143
1144  input_location = UNKNOWN_LOCATION;
1145
1146  /* If an error has occurred in cpplib, note it so we fail
1147     immediately.  */
1148  errorcount += cpp_errors (parse_in);
1149
1150  *pfilename = this_input_filename
1151    = cpp_read_main_file (parse_in, in_fnames[0]);
1152  /* Don't do any compilation or preprocessing if there is no input file.  */
1153  if (this_input_filename == NULL)
1154    {
1155      errorcount++;
1156      return false;
1157    }
1158
1159  if (flag_working_directory
1160      && flag_preprocess_only && !flag_no_line_commands)
1161    pp_dir_change (parse_in, get_src_pwd ());
1162
1163  return flag_preprocess_only;
1164}
1165
1166/* Front end initialization common to C, ObjC and C++.  */
1167bool
1168c_common_init (void)
1169{
1170  /* Set up preprocessor arithmetic.  Must be done after call to
1171     c_common_nodes_and_builtins for type nodes to be good.  */
1172  cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1173  cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1174  cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1175  cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1176  cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1177  cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1178
1179  /* This can't happen until after wchar_precision and bytes_big_endian
1180     are known.  */
1181  cpp_init_iconv (parse_in);
1182
1183  if (version_flag)
1184    c_common_print_pch_checksum (stderr);
1185
1186  if (flag_preprocess_only)
1187    {
1188      finish_options ();
1189      preprocess_file (parse_in);
1190      return false;
1191    }
1192
1193  /* Has to wait until now so that cpplib has its hash table.  */
1194  init_pragma ();
1195
1196  return true;
1197}
1198
1199/* Initialize the integrated preprocessor after debug output has been
1200   initialized; loop over each input file.  */
1201void
1202c_common_parse_file (int set_yydebug)
1203{
1204  unsigned int i;
1205
1206  /* Enable parser debugging, if requested and we can.  If requested
1207     and we can't, notify the user.  */
1208#if YYDEBUG != 0
1209  yydebug = set_yydebug;
1210#else
1211  if (set_yydebug)
1212    warning (0, "YYDEBUG was not defined at build time, -dy ignored");
1213#endif
1214
1215  i = 0;
1216  for (;;)
1217    {
1218      /* Start the main input file, if the debug writer wants it. */
1219      if (debug_hooks->start_end_main_source_file)
1220	(*debug_hooks->start_source_file) (0, this_input_filename);
1221      finish_options ();
1222      pch_init ();
1223      push_file_scope ();
1224      c_parse_file ();
1225      finish_file ();
1226      pop_file_scope ();
1227      /* And end the main input file, if the debug writer wants it  */
1228      if (debug_hooks->start_end_main_source_file)
1229	(*debug_hooks->end_source_file) (0);
1230      if (++i >= num_in_fnames)
1231	break;
1232      cpp_undef_all (parse_in);
1233      this_input_filename
1234	= cpp_read_main_file (parse_in, in_fnames[i]);
1235      /* If an input file is missing, abandon further compilation.
1236	 cpplib has issued a diagnostic.  */
1237      if (!this_input_filename)
1238	break;
1239    }
1240}
1241
1242/* Common finish hook for the C, ObjC and C++ front ends.  */
1243void
1244c_common_finish (void)
1245{
1246  FILE *deps_stream = NULL;
1247
1248  if (cpp_opts->deps.style != DEPS_NONE)
1249    {
1250      /* If -M or -MM was seen without -MF, default output to the
1251	 output stream.  */
1252      if (!deps_file)
1253	deps_stream = out_stream;
1254      else
1255	{
1256	  deps_stream = fopen (deps_file, deps_append ? "a": "w");
1257	  if (!deps_stream)
1258	    fatal_error ("opening dependency file %s: %m", deps_file);
1259	}
1260    }
1261
1262  /* For performance, avoid tearing down cpplib's internal structures
1263     with cpp_destroy ().  */
1264  errorcount += cpp_finish (parse_in, deps_stream);
1265
1266  if (deps_stream && deps_stream != out_stream
1267      && (ferror (deps_stream) || fclose (deps_stream)))
1268    fatal_error ("closing dependency file %s: %m", deps_file);
1269
1270  if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1271    fatal_error ("when writing output to %s: %m", out_fname);
1272}
1273
1274/* Either of two environment variables can specify output of
1275   dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1276   DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1277   and DEPS_TARGET is the target to mention in the deps.  They also
1278   result in dependency information being appended to the output file
1279   rather than overwriting it, and like Sun's compiler
1280   SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
1281static void
1282check_deps_environment_vars (void)
1283{
1284  char *spec;
1285
1286  GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1287  if (spec)
1288    cpp_opts->deps.style = DEPS_USER;
1289  else
1290    {
1291      GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1292      if (spec)
1293	{
1294	  cpp_opts->deps.style = DEPS_SYSTEM;
1295	  cpp_opts->deps.ignore_main_file = true;
1296	}
1297    }
1298
1299  if (spec)
1300    {
1301      /* Find the space before the DEPS_TARGET, if there is one.  */
1302      char *s = strchr (spec, ' ');
1303      if (s)
1304	{
1305	  /* Let the caller perform MAKE quoting.  */
1306	  defer_opt (OPT_MT, s + 1);
1307	  *s = '\0';
1308	}
1309
1310      /* Command line -MF overrides environment variables and default.  */
1311      if (!deps_file)
1312	deps_file = spec;
1313
1314      deps_append = 1;
1315      deps_seen = true;
1316    }
1317}
1318
1319/* Handle deferred command line switches.  */
1320static void
1321handle_deferred_opts (void)
1322{
1323  size_t i;
1324  struct deps *deps;
1325
1326  /* Avoid allocating the deps buffer if we don't need it.
1327     (This flag may be true without there having been -MT or -MQ
1328     options, but we'll still need the deps buffer.)  */
1329  if (!deps_seen)
1330    return;
1331
1332  deps = cpp_get_deps (parse_in);
1333
1334  for (i = 0; i < deferred_count; i++)
1335    {
1336      struct deferred_opt *opt = &deferred_opts[i];
1337
1338      if (opt->code == OPT_MT || opt->code == OPT_MQ)
1339	deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1340    }
1341}
1342
1343/* These settings are appropriate for GCC, but not necessarily so for
1344   cpplib as a library.  */
1345static void
1346sanitize_cpp_opts (void)
1347{
1348  /* If we don't know what style of dependencies to output, complain
1349     if any other dependency switches have been given.  */
1350  if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1351    error ("to generate dependencies you must specify either -M or -MM");
1352
1353  /* -dM and dependencies suppress normal output; do it here so that
1354     the last -d[MDN] switch overrides earlier ones.  */
1355  if (flag_dump_macros == 'M')
1356    flag_no_output = 1;
1357
1358  /* By default, -fdirectives-only implies -dD.  This allows subsequent phases
1359     to perform proper macro expansion.  */
1360  if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
1361    flag_dump_macros = 'D';
1362
1363  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
1364     -dM since at least glibc relies on -M -dM to work.  */
1365  /* Also, flag_no_output implies flag_no_line_commands, always.  */
1366  if (flag_no_output)
1367    {
1368      if (flag_dump_macros != 'M')
1369	flag_dump_macros = 0;
1370      flag_dump_includes = 0;
1371      flag_no_line_commands = 1;
1372    }
1373
1374  cpp_opts->unsigned_char = !flag_signed_char;
1375  cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1376
1377  /* We want -Wno-long-long to override -pedantic -std=non-c99
1378     and/or -Wtraditional, whatever the ordering.  */
1379  cpp_opts->warn_long_long
1380    = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1381
1382  /* Similarly with -Wno-variadic-macros.  No check for c99 here, since
1383     this also turns off warnings about GCCs extension.  */
1384  cpp_opts->warn_variadic_macros
1385    = warn_variadic_macros && (pedantic || warn_traditional);
1386
1387  /* If we're generating preprocessor output, emit current directory
1388     if explicitly requested or if debugging information is enabled.
1389     ??? Maybe we should only do it for debugging formats that
1390     actually output the current directory?  */
1391  if (flag_working_directory == -1)
1392    flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1393
1394  if (cpp_opts->directives_only)
1395    {
1396      if (warn_unused_macros)
1397	error ("-fdirectives-only is incompatible with -Wunused_macros");
1398      if (cpp_opts->traditional)
1399	error ("-fdirectives-only is incompatible with -traditional");
1400    }
1401}
1402
1403/* Add include path with a prefix at the front of its name.  */
1404static void
1405add_prefixed_path (const char *suffix, size_t chain)
1406{
1407  char *path;
1408  const char *prefix;
1409  size_t prefix_len, suffix_len;
1410
1411  suffix_len = strlen (suffix);
1412  prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1413  prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1414
1415  path = (char *) xmalloc (prefix_len + suffix_len + 1);
1416  memcpy (path, prefix, prefix_len);
1417  memcpy (path + prefix_len, suffix, suffix_len);
1418  path[prefix_len + suffix_len] = '\0';
1419
1420  add_path (path, chain, 0, false);
1421}
1422
1423/* Handle -D, -U, -A, -imacros, and the first -include.  */
1424static void
1425finish_options (void)
1426{
1427  if (!cpp_opts->preprocessed)
1428    {
1429      size_t i;
1430
1431      cb_file_change (parse_in,
1432		      linemap_add (&line_table, LC_RENAME, 0,
1433				   _("<built-in>"), 0));
1434
1435      cpp_init_builtins (parse_in, flag_hosted);
1436      c_cpp_builtins (parse_in);
1437
1438      /* We're about to send user input to cpplib, so make it warn for
1439	 things that we previously (when we sent it internal definitions)
1440	 told it to not warn.
1441
1442	 C99 permits implementation-defined characters in identifiers.
1443	 The documented meaning of -std= is to turn off extensions that
1444	 conflict with the specified standard, and since a strictly
1445	 conforming program cannot contain a '$', we do not condition
1446	 their acceptance on the -std= setting.  */
1447      cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1448
1449      cb_file_change (parse_in,
1450		      linemap_add (&line_table, LC_RENAME, 0,
1451				   _("<command-line>"), 0));
1452
1453      for (i = 0; i < deferred_count; i++)
1454	{
1455	  struct deferred_opt *opt = &deferred_opts[i];
1456
1457	  if (opt->code == OPT_D)
1458	    cpp_define (parse_in, opt->arg);
1459	  else if (opt->code == OPT_U)
1460	    cpp_undef (parse_in, opt->arg);
1461	  else if (opt->code == OPT_A)
1462	    {
1463	      if (opt->arg[0] == '-')
1464		cpp_unassert (parse_in, opt->arg + 1);
1465	      else
1466		cpp_assert (parse_in, opt->arg);
1467	    }
1468	}
1469
1470      /* Handle -imacros after -D and -U.  */
1471      for (i = 0; i < deferred_count; i++)
1472	{
1473	  struct deferred_opt *opt = &deferred_opts[i];
1474
1475	  if (opt->code == OPT_imacros
1476	      && cpp_push_include (parse_in, opt->arg))
1477	    {
1478	      /* Disable push_command_line_include callback for now.  */
1479	      include_cursor = deferred_count + 1;
1480	      cpp_scan_nooutput (parse_in);
1481	    }
1482	}
1483    }
1484  else if (cpp_opts->directives_only)
1485    cpp_init_special_builtins (parse_in);
1486
1487  include_cursor = 0;
1488  push_command_line_include ();
1489}
1490
1491/* Give CPP the next file given by -include, if any.  */
1492static void
1493push_command_line_include (void)
1494{
1495  while (include_cursor < deferred_count)
1496    {
1497      struct deferred_opt *opt = &deferred_opts[include_cursor++];
1498
1499      if (!cpp_opts->preprocessed && opt->code == OPT_include
1500	  && cpp_push_include (parse_in, opt->arg))
1501	return;
1502    }
1503
1504  if (include_cursor == deferred_count)
1505    {
1506      include_cursor++;
1507      /* -Wunused-macros should only warn about macros defined hereafter.  */
1508      cpp_opts->warn_unused_macros = warn_unused_macros;
1509      /* Restore the line map from <command line>.  */
1510      if (!cpp_opts->preprocessed)
1511	cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1512
1513      /* Set this here so the client can change the option if it wishes,
1514	 and after stacking the main file so we don't trace the main file.  */
1515      line_table.trace_includes = cpp_opts->print_include_names;
1516    }
1517}
1518
1519/* File change callback.  Has to handle -include files.  */
1520static void
1521cb_file_change (cpp_reader * ARG_UNUSED (pfile),
1522		const struct line_map *new_map)
1523{
1524  if (flag_preprocess_only)
1525    pp_file_change (new_map);
1526  else
1527    fe_file_change (new_map);
1528
1529  if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1530    push_command_line_include ();
1531}
1532
1533void
1534cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1535{
1536  if (!set_src_pwd (dir))
1537    warning (0, "too late for # directive to set debug directory");
1538}
1539
1540/* Set the C 89 standard (with 1994 amendments if C94, without GNU
1541   extensions if ISO).  There is no concept of gnu94.  */
1542static void
1543set_std_c89 (int c94, int iso)
1544{
1545  cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1546  flag_iso = iso;
1547  flag_no_asm = iso;
1548  flag_no_gnu_keywords = iso;
1549  flag_no_nonansi_builtin = iso;
1550  flag_isoc94 = c94;
1551  flag_isoc99 = 0;
1552}
1553
1554/* Set the C 99 standard (without GNU extensions if ISO).  */
1555static void
1556set_std_c99 (int iso)
1557{
1558  cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1559  flag_no_asm = iso;
1560  flag_no_nonansi_builtin = iso;
1561  flag_iso = iso;
1562  flag_isoc99 = 1;
1563  flag_isoc94 = 1;
1564}
1565
1566/* Set the C++ 98 standard (without GNU extensions if ISO).  */
1567static void
1568set_std_cxx98 (int iso)
1569{
1570  cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1571  flag_no_gnu_keywords = iso;
1572  flag_no_nonansi_builtin = iso;
1573  flag_iso = iso;
1574}
1575
1576/* Handle setting implicit to ON.  */
1577static void
1578set_Wimplicit (int on)
1579{
1580  warn_implicit = on;
1581  warn_implicit_int = on;
1582  if (on)
1583    {
1584      if (mesg_implicit_function_declaration != 2)
1585	mesg_implicit_function_declaration = 1;
1586    }
1587  else
1588    mesg_implicit_function_declaration = 0;
1589}
1590
1591/* Args to -d specify what to dump.  Silently ignore
1592   unrecognized options; they may be aimed at toplev.c.  */
1593static void
1594handle_OPT_d (const char *arg)
1595{
1596  char c;
1597
1598  while ((c = *arg++) != '\0')
1599    switch (c)
1600      {
1601      case 'M':			/* Dump macros only.  */
1602      case 'N':			/* Dump names.  */
1603      case 'D':			/* Dump definitions.  */
1604	flag_dump_macros = c;
1605	break;
1606
1607      case 'I':
1608	flag_dump_includes = 1;
1609	break;
1610      }
1611}
1612