1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Neil Booth.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
30 #include "langhooks.h"
31 #include "diagnostic.h"
33 #include "cppdefault.h"
35 #include "debug.h" /* For debug_hooks. */
39 #include "target.h" /* For gcc_targetcm. */
40 #include "tm_p.h" /* For C_COMMON_OVERRIDE_OPTIONS. */
42 #ifndef DOLLARS_IN_IDENTIFIERS
43 # define DOLLARS_IN_IDENTIFIERS true
46 #ifndef TARGET_SYSTEM_ROOT
47 # define TARGET_SYSTEM_ROOT NULL
51 #define TARGET_OPTF(ARG)
55 cpp_options
*cpp_opts
;
58 static const char *this_input_filename
;
60 /* Filename and stream for preprocessed output. */
61 static const char *out_fname
;
62 static FILE *out_stream
;
64 /* Append dependencies to deps_file. */
65 static bool deps_append
;
67 /* If dependency switches (-MF etc.) have been given. */
68 static bool deps_seen
;
73 /* Dependency output file. */
74 static const char *deps_file
;
76 /* The prefix given by -iprefix, if any. */
77 static const char *iprefix
;
79 /* The multilib directory given by -imultilib, if any. */
80 static const char *imultilib
;
82 /* The system root, if any. Overridden by -isysroot. */
83 static const char *sysroot
= TARGET_SYSTEM_ROOT
;
85 /* Zero disables all standard directories for headers. */
86 static bool std_inc
= true;
88 /* Zero disables the C++-specific standard directories for headers. */
89 static bool std_cxx_inc
= true;
91 /* If the quote chain has been split by -I-. */
92 static bool quote_chain_split
;
94 /* If -Wunused-macros. */
95 static bool warn_unused_macros
;
97 /* If -Wvariadic-macros. */
98 static bool warn_variadic_macros
= true;
100 /* Number of deferred options. */
101 static size_t deferred_count
;
103 /* Number of deferred options scanned for -include. */
104 static size_t include_cursor
;
106 static void handle_OPT_d (const char *);
107 static void set_std_cxx98 (int);
108 static void set_std_cxx0x (int);
109 static void set_std_c89 (int, int);
110 static void set_std_c99 (int);
111 static void set_std_c1x (int);
112 static void check_deps_environment_vars (void);
113 static void handle_deferred_opts (void);
114 static void sanitize_cpp_opts (void);
115 static void add_prefixed_path (const char *, size_t);
116 static void push_command_line_include (void);
117 static void cb_file_change (cpp_reader
*, const struct line_map
*);
118 static void cb_dir_change (cpp_reader
*, const char *);
119 static void finish_options (void);
121 #ifndef STDC_0_IN_SYSTEM_HEADERS
122 #define STDC_0_IN_SYSTEM_HEADERS 0
125 /* Holds switches parsed by c_common_handle_option (), but whose
126 handling is deferred to c_common_post_options (). */
127 static void defer_opt (enum opt_code
, const char *);
128 static struct deferred_opt
135 static const unsigned int
136 c_family_lang_mask
= (CL_C
| CL_CXX
| CL_ObjC
| CL_ObjCXX
);
138 /* Defer option CODE with argument ARG. */
140 defer_opt (enum opt_code code
, const char *arg
)
142 deferred_opts
[deferred_count
].code
= code
;
143 deferred_opts
[deferred_count
].arg
= arg
;
147 /* -Werror= may set a warning option to enable a warning that is emitted
148 by the preprocessor. Set any corresponding flag in cpp_opts. */
151 warning_as_error_callback (int option_index
)
153 switch (option_index
)
156 /* Ignore options not associated with the preprocessor. */
159 case OPT_Wdeprecated
:
160 cpp_opts
->cpp_warn_deprecated
= 1;
164 cpp_opts
->warn_comments
= 1;
168 cpp_opts
->warn_trigraphs
= 1;
172 cpp_opts
->warn_multichar
= 1;
175 case OPT_Wtraditional
:
176 cpp_opts
->cpp_warn_traditional
= 1;
180 cpp_opts
->cpp_warn_long_long
= 1;
183 case OPT_Wendif_labels
:
184 cpp_opts
->warn_endif_labels
= 1;
187 case OPT_Wvariadic_macros
:
188 /* Set the local flag that is used later to update cpp_opts. */
189 warn_variadic_macros
= 1;
192 case OPT_Wbuiltin_macro_redefined
:
193 cpp_opts
->warn_builtin_macro_redefined
= 1;
197 cpp_opts
->warn_undef
= 1;
200 case OPT_Wunused_macros
:
201 /* Set the local flag that is used later to update cpp_opts. */
202 warn_unused_macros
= 1;
205 case OPT_Wc___compat
:
206 /* Add warnings in the same way as c_common_handle_option below. */
207 if (warn_enum_compare
== -1)
208 warn_enum_compare
= 1;
209 if (warn_jump_misses_init
== -1)
210 warn_jump_misses_init
= 1;
211 cpp_opts
->warn_cxx_operator_names
= 1;
214 case OPT_Wnormalized_
:
215 inform (input_location
, "-Werror=normalized=: Set -Wnormalized=nfc");
216 cpp_opts
->warn_normalize
= normalized_C
;
219 case OPT_Winvalid_pch
:
220 cpp_opts
->warn_invalid_pch
= 1;
224 /* Handled by standard diagnostics using the option's associated
230 /* Return language mask for option parsing. */
232 c_common_option_lang_mask (void)
234 static const unsigned int lang_flags
[] = {CL_C
, CL_ObjC
, CL_CXX
, CL_ObjCXX
};
236 return lang_flags
[c_language
];
239 /* Common diagnostics initialization. */
241 c_common_initialize_diagnostics (diagnostic_context
*context
)
243 /* Register callback for warnings enabled by -Werror=. */
244 register_warning_as_error_callback (warning_as_error_callback
);
246 /* This is conditionalized only because that is the way the front
247 ends used to do it. Maybe this should be unconditional? */
248 if (c_dialect_cxx ())
250 /* By default wrap lines at 80 characters. Is getenv
251 ("COLUMNS") preferable? */
252 diagnostic_line_cutoff (context
) = 80;
253 /* By default, emit location information once for every
254 diagnostic message. */
255 diagnostic_prefixing_rule (context
) = DIAGNOSTICS_SHOW_PREFIX_ONCE
;
258 context
->opt_permissive
= OPT_fpermissive
;
261 /* Whether options from all C-family languages should be accepted
263 static bool accept_all_c_family_options
= false;
265 /* Return whether to complain about a wrong-language option. */
267 c_common_complain_wrong_lang_p (const struct cl_option
*option
)
269 if (accept_all_c_family_options
270 && (option
->flags
& c_family_lang_mask
))
276 /* Common initialization before calling option handlers. */
278 c_common_init_options (unsigned int decoded_options_count
,
279 struct cl_decoded_option
*decoded_options
)
282 struct cpp_callbacks
*cb
;
284 parse_in
= cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX
: CLK_GNUC89
,
285 ident_hash
, line_table
);
286 cb
= cpp_get_callbacks (parse_in
);
287 cb
->error
= c_cpp_error
;
289 cpp_opts
= cpp_get_options (parse_in
);
290 cpp_opts
->dollars_in_ident
= DOLLARS_IN_IDENTIFIERS
;
291 cpp_opts
->objc
= c_dialect_objc ();
293 /* Reset to avoid warnings on internal definitions. We set it just
294 before passing on command-line options to cpplib. */
295 cpp_opts
->warn_dollars
= 0;
297 flag_exceptions
= c_dialect_cxx ();
298 warn_pointer_arith
= c_dialect_cxx ();
299 warn_write_strings
= c_dialect_cxx();
300 flag_warn_unused_result
= true;
302 /* By default, C99-like requirements for complex multiply and divide. */
303 flag_complex_method
= 2;
305 deferred_opts
= XNEWVEC (struct deferred_opt
, decoded_options_count
);
307 if (c_language
== clk_c
)
309 /* If preprocessing assembly language, accept any of the C-family
310 front end options since the driver may pass them through. */
311 for (i
= 1; i
< decoded_options_count
; i
++)
312 if (decoded_options
[i
].opt_index
== OPT_lang_asm
)
314 accept_all_c_family_options
= true;
320 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
321 form of an -f or -W option was given. Returns false if the switch was
322 invalid, true if valid. Use HANDLERS in recursive handle_option calls. */
324 c_common_handle_option (size_t scode
, const char *arg
, int value
,
325 int kind
, const struct cl_option_handlers
*handlers
)
327 const struct cl_option
*option
= &cl_options
[scode
];
328 enum opt_code code
= (enum opt_code
) scode
;
331 /* Prevent resetting the language standard to a C dialect when the driver
332 has already determined that we're looking at assembler input. */
333 bool preprocessing_asm_p
= (cpp_get_options (parse_in
)->lang
== CLK_ASM
);
338 if (cl_options
[code
].flags
& c_family_lang_mask
)
340 if ((option
->flags
& CL_TARGET
)
341 && ! targetcm
.handle_c_option (scode
, arg
, value
))
348 case OPT__output_pch_
:
353 defer_opt (code
, arg
);
357 cpp_opts
->discard_comments
= 0;
361 cpp_opts
->discard_comments
= 0;
362 cpp_opts
->discard_comments_in_macro_exp
= 0;
366 defer_opt (code
, arg
);
370 cpp_opts
->print_include_names
= 1;
374 TARGET_OPTF (xstrdup (arg
));
378 if (strcmp (arg
, "-"))
379 add_path (xstrdup (arg
), BRACKET
, 0, true);
382 if (quote_chain_split
)
383 error ("-I- specified twice");
384 quote_chain_split
= true;
385 split_quote_chain ();
386 inform (input_location
, "obsolete option -I- used, please use -iquote instead");
392 /* When doing dependencies with -M or -MM, suppress normal
393 preprocessed output, but still do -dM etc. as software
394 depends on this. Preprocessed output does occur if -MD, -MMD
395 or environment var dependency generation is used. */
396 cpp_opts
->deps
.style
= (code
== OPT_M
? DEPS_SYSTEM
: DEPS_USER
);
402 cpp_opts
->deps
.style
= (code
== OPT_MD
? DEPS_SYSTEM
: DEPS_USER
);
403 cpp_opts
->deps
.need_preprocessor_output
= true;
414 cpp_opts
->deps
.missing_files
= true;
419 cpp_opts
->deps
.phony_targets
= true;
425 defer_opt (code
, arg
);
429 flag_no_line_commands
= 1;
433 defer_opt (code
, arg
);
439 handle_generated_option (&global_options
, &global_options_set
,
440 OPT_Wimplicit
, NULL
, value
,
441 c_family_lang_mask
, kind
, handlers
);
442 warn_char_subscripts
= value
;
443 warn_missing_braces
= value
;
444 warn_parentheses
= value
;
445 warn_return_type
= value
;
446 warn_sequence_point
= value
; /* Was C only. */
448 if (warn_strict_aliasing
== -1)
449 set_Wstrict_aliasing (value
);
450 warn_address
= value
;
451 if (warn_strict_overflow
== -1)
452 warn_strict_overflow
= value
;
453 warn_array_bounds
= value
;
454 warn_volatile_register_var
= value
;
456 /* Only warn about unknown pragmas that are not in system
458 warn_unknown_pragmas
= value
;
460 warn_uninitialized
= value
;
462 if (!c_dialect_cxx ())
464 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
465 can turn it off only if it's not explicit. */
467 warn_main
= (value
? 2 : 0);
469 /* In C, -Wall turns on -Wenum-compare, which we do here.
470 In C++ it is on by default, which is done in
471 c_common_post_options. */
472 if (warn_enum_compare
== -1)
473 warn_enum_compare
= value
;
477 /* C++-specific warnings. */
478 warn_sign_compare
= value
;
479 warn_reorder
= value
;
480 warn_cxx0x_compat
= value
;
483 cpp_opts
->warn_trigraphs
= value
;
484 cpp_opts
->warn_comments
= value
;
485 cpp_opts
->warn_num_sign_change
= value
;
487 if (warn_pointer_sign
== -1)
488 warn_pointer_sign
= value
;
491 case OPT_Wbuiltin_macro_redefined
:
492 cpp_opts
->warn_builtin_macro_redefined
= value
;
496 cpp_opts
->warn_comments
= value
;
499 case OPT_Wc___compat
:
500 /* Because -Wenum-compare is the default in C++, -Wc++-compat
501 implies -Wenum-compare. */
502 if (warn_enum_compare
== -1 && value
)
503 warn_enum_compare
= value
;
504 /* Because C++ always warns about a goto which misses an
505 initialization, -Wc++-compat turns on -Wjump-misses-init. */
506 if (warn_jump_misses_init
== -1 && value
)
507 warn_jump_misses_init
= value
;
508 cpp_opts
->warn_cxx_operator_names
= value
;
511 case OPT_Wdeprecated
:
512 cpp_opts
->cpp_warn_deprecated
= value
;
515 case OPT_Wendif_labels
:
516 cpp_opts
->warn_endif_labels
= value
;
520 global_dc
->warning_as_error_requested
= value
;
528 set_Wformat (atoi (arg
));
532 gcc_assert (value
== 0 || value
== 1);
533 if (warn_implicit_int
== -1)
534 handle_generated_option (&global_options
, &global_options_set
,
535 OPT_Wimplicit_int
, NULL
, value
,
536 c_family_lang_mask
, kind
, handlers
);
537 if (warn_implicit_function_declaration
== -1)
538 handle_generated_option (&global_options
, &global_options_set
,
539 OPT_Wimplicit_function_declaration
, NULL
,
540 value
, c_family_lang_mask
, kind
, handlers
);
543 case OPT_Winvalid_pch
:
544 cpp_opts
->warn_invalid_pch
= value
;
547 case OPT_Wmissing_include_dirs
:
548 cpp_opts
->warn_missing_include_dirs
= value
;
552 cpp_opts
->warn_multichar
= value
;
555 case OPT_Wnormalized_
:
556 if (!value
|| (arg
&& strcasecmp (arg
, "none") == 0))
557 cpp_opts
->warn_normalize
= normalized_none
;
558 else if (!arg
|| strcasecmp (arg
, "nfkc") == 0)
559 cpp_opts
->warn_normalize
= normalized_KC
;
560 else if (strcasecmp (arg
, "id") == 0)
561 cpp_opts
->warn_normalize
= normalized_identifier_C
;
562 else if (strcasecmp (arg
, "nfc") == 0)
563 cpp_opts
->warn_normalize
= normalized_C
;
565 error ("argument %qs to %<-Wnormalized%> not recognized", arg
);
568 case OPT_Wreturn_type
:
569 warn_return_type
= value
;
572 case OPT_Wtraditional
:
573 cpp_opts
->cpp_warn_traditional
= value
;
577 cpp_opts
->warn_trigraphs
= value
;
581 cpp_opts
->warn_undef
= value
;
584 case OPT_Wunknown_pragmas
:
585 /* Set to greater than 1, so that even unknown pragmas in
586 system headers will be warned about. */
587 warn_unknown_pragmas
= value
* 2;
590 case OPT_Wunused_macros
:
591 warn_unused_macros
= value
;
594 case OPT_Wvariadic_macros
:
595 warn_variadic_macros
= value
;
598 case OPT_Wwrite_strings
:
599 warn_write_strings
= value
;
605 warn_nonvdtor
= true;
609 if (!c_dialect_cxx ())
610 set_std_c89 (false, true);
612 set_std_cxx98 (true);
619 case OPT_fcond_mismatch
:
620 if (!c_dialect_cxx ())
622 flag_cond_mismatch
= value
;
625 warning (0, "switch %qs is no longer supported", option
->opt_text
);
632 disable_builtin_function (arg
);
635 case OPT_fdirectives_only
:
636 cpp_opts
->directives_only
= value
;
639 case OPT_fdollars_in_identifiers
:
640 cpp_opts
->dollars_in_ident
= value
;
643 case OPT_ffreestanding
:
645 /* Fall through.... */
648 flag_no_builtin
= !value
;
651 case OPT_fconstant_string_class_
:
652 constant_string_class_name
= arg
;
655 case OPT_fextended_identifiers
:
656 cpp_opts
->extended_identifiers
= value
;
659 case OPT_fgnu_runtime
:
660 flag_next_runtime
= !value
;
663 case OPT_fnext_runtime
:
664 flag_next_runtime
= value
;
667 case OPT_foperator_names
:
668 cpp_opts
->operator_names
= value
;
672 cpp_opts
->restore_pch_deps
= value
;
675 case OPT_fpch_preprocess
:
676 flag_pch_preprocess
= value
;
679 case OPT_fpermissive
:
680 flag_permissive
= value
;
681 global_dc
->permissive
= value
;
684 case OPT_fpreprocessed
:
685 cpp_opts
->preprocessed
= value
;
689 flag_use_repository
= value
;
691 flag_implicit_templates
= 0;
695 /* It is documented that we silently ignore silly values. */
696 if (value
>= 1 && value
<= 100)
697 cpp_opts
->tabstop
= value
;
700 case OPT_fexec_charset_
:
701 cpp_opts
->narrow_charset
= arg
;
704 case OPT_fwide_exec_charset_
:
705 cpp_opts
->wide_charset
= arg
;
708 case OPT_finput_charset_
:
709 cpp_opts
->input_charset
= arg
;
712 case OPT_ftemplate_depth_
:
713 max_tinst_depth
= value
;
716 case OPT_fvisibility_inlines_hidden
:
717 visibility_options
.inlines_hidden
= value
;
720 case OPT_femit_struct_debug_baseonly
:
721 set_struct_debug_option ("base");
724 case OPT_femit_struct_debug_reduced
:
725 set_struct_debug_option ("dir:ord:sys,dir:gen:any,ind:base");
728 case OPT_femit_struct_debug_detailed_
:
729 set_struct_debug_option (arg
);
733 add_path (xstrdup (arg
), AFTER
, 0, true);
738 defer_opt (code
, arg
);
750 add_path (xstrdup (arg
), QUOTE
, 0, true);
758 add_path (xstrdup (arg
), SYSTEM
, 0, true);
761 case OPT_iwithprefix
:
762 add_prefixed_path (arg
, SYSTEM
);
765 case OPT_iwithprefixbefore
:
766 add_prefixed_path (arg
, BRACKET
);
770 cpp_set_lang (parse_in
, CLK_ASM
);
771 cpp_opts
->dollars_in_ident
= false;
786 error ("output filename specified twice");
789 /* We need to handle the -pedantic switches here, rather than in
790 c_common_post_options, so that a subsequent -Wno-endif-labels
791 is not overridden. */
792 case OPT_pedantic_errors
:
794 cpp_opts
->cpp_pedantic
= 1;
795 cpp_opts
->warn_endif_labels
= 1;
796 if (warn_pointer_sign
== -1)
797 warn_pointer_sign
= 1;
798 if (warn_overlength_strings
== -1)
799 warn_overlength_strings
= 1;
804 case OPT_print_objc_runtime_info
:
805 print_struct_values
= 1;
813 case OPT_std_gnu__98
:
814 if (!preprocessing_asm_p
)
815 set_std_cxx98 (code
== OPT_std_c__98
/* ISO */);
819 case OPT_std_gnu__0x
:
820 if (!preprocessing_asm_p
)
821 set_std_cxx0x (code
== OPT_std_c__0x
/* ISO */);
825 case OPT_std_iso9899_199409
:
826 if (!preprocessing_asm_p
)
827 set_std_c89 (code
== OPT_std_iso9899_199409
/* c94 */, true /* ISO */);
831 if (!preprocessing_asm_p
)
832 set_std_c89 (false /* c94 */, false /* ISO */);
836 if (!preprocessing_asm_p
)
837 set_std_c99 (true /* ISO */);
841 if (!preprocessing_asm_p
)
842 set_std_c99 (false /* ISO */);
846 if (!preprocessing_asm_p
)
847 set_std_c1x (true /* ISO */);
851 if (!preprocessing_asm_p
)
852 set_std_c1x (false /* ISO */);
856 cpp_opts
->trigraphs
= 1;
859 case OPT_traditional_cpp
:
860 cpp_opts
->traditional
= 1;
875 /* Post-switch processing. */
877 c_common_post_options (const char **pfilename
)
879 struct cpp_callbacks
*cb
;
881 /* Canonicalize the input and output filenames. */
882 if (in_fnames
== NULL
)
884 in_fnames
= XNEWVEC (const char *, 1);
887 else if (strcmp (in_fnames
[0], "-") == 0)
890 if (out_fname
== NULL
|| !strcmp (out_fname
, "-"))
893 if (cpp_opts
->deps
.style
== DEPS_NONE
)
894 check_deps_environment_vars ();
896 handle_deferred_opts ();
898 sanitize_cpp_opts ();
900 register_include_chains (parse_in
, sysroot
, iprefix
, imultilib
,
901 std_inc
, std_cxx_inc
&& c_dialect_cxx (), verbose
);
903 #ifdef C_COMMON_OVERRIDE_OPTIONS
904 /* Some machines may reject certain combinations of C
905 language-specific options. */
906 C_COMMON_OVERRIDE_OPTIONS
;
909 /* Excess precision other than "fast" requires front-end
911 if (c_dialect_cxx ())
913 if (flag_excess_precision_cmdline
== EXCESS_PRECISION_STANDARD
914 && TARGET_FLT_EVAL_METHOD_NON_DEFAULT
)
915 sorry ("-fexcess-precision=standard for C++");
916 flag_excess_precision_cmdline
= EXCESS_PRECISION_FAST
;
918 else if (flag_excess_precision_cmdline
== EXCESS_PRECISION_DEFAULT
)
919 flag_excess_precision_cmdline
= (flag_iso
920 ? EXCESS_PRECISION_STANDARD
921 : EXCESS_PRECISION_FAST
);
923 /* By default we use C99 inline semantics in GNU99 or C99 mode. C99
924 inline semantics are not supported in GNU89 or C89 mode. */
925 if (flag_gnu89_inline
== -1)
926 flag_gnu89_inline
= !flag_isoc99
;
927 else if (!flag_gnu89_inline
&& !flag_isoc99
)
928 error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
930 /* Default to ObjC sjlj exception handling if NeXT runtime. */
931 if (flag_objc_sjlj_exceptions
< 0)
932 flag_objc_sjlj_exceptions
= flag_next_runtime
;
933 if (flag_objc_exceptions
&& !flag_objc_sjlj_exceptions
)
936 /* -Wextra implies the following flags
937 unless explicitly overridden. */
938 if (warn_type_limits
== -1)
939 warn_type_limits
= extra_warnings
;
940 if (warn_clobbered
== -1)
941 warn_clobbered
= extra_warnings
;
942 if (warn_empty_body
== -1)
943 warn_empty_body
= extra_warnings
;
944 if (warn_sign_compare
== -1)
945 warn_sign_compare
= extra_warnings
;
946 if (warn_missing_field_initializers
== -1)
947 warn_missing_field_initializers
= extra_warnings
;
948 if (warn_missing_parameter_type
== -1)
949 warn_missing_parameter_type
= extra_warnings
;
950 if (warn_old_style_declaration
== -1)
951 warn_old_style_declaration
= extra_warnings
;
952 if (warn_override_init
== -1)
953 warn_override_init
= extra_warnings
;
954 if (warn_ignored_qualifiers
== -1)
955 warn_ignored_qualifiers
= extra_warnings
;
957 /* -Wpointer-sign is disabled by default, but it is enabled if any
958 of -Wall or -pedantic are given. */
959 if (warn_pointer_sign
== -1)
960 warn_pointer_sign
= 0;
962 if (warn_strict_aliasing
== -1)
963 warn_strict_aliasing
= 0;
964 if (warn_strict_overflow
== -1)
965 warn_strict_overflow
= 0;
966 if (warn_jump_misses_init
== -1)
967 warn_jump_misses_init
= 0;
969 /* -Woverlength-strings is off by default, but is enabled by -pedantic.
970 It is never enabled in C++, as the minimum limit is not normative
972 if (warn_overlength_strings
== -1 || c_dialect_cxx ())
973 warn_overlength_strings
= 0;
975 /* Wmain is enabled by default in C++ but not in C. */
976 /* Wmain is disabled by default for -ffreestanding (!flag_hosted),
977 even if -Wall was given (warn_main will be 2 if set by -Wall, 1
978 if set by -Wmain). */
980 warn_main
= (c_dialect_cxx () && flag_hosted
) ? 1 : 0;
981 else if (warn_main
== 2)
982 warn_main
= flag_hosted
? 1 : 0;
984 /* In C, -Wconversion enables -Wsign-conversion (unless disabled
985 through -Wno-sign-conversion). While in C++,
986 -Wsign-conversion needs to be requested explicitly. */
987 if (warn_sign_conversion
== -1)
988 warn_sign_conversion
= (c_dialect_cxx ()) ? 0 : warn_conversion
;
990 /* In C, -Wall and -Wc++-compat enable -Wenum-compare, which we do
991 in c_common_handle_option; if it has not yet been set, it is
992 disabled by default. In C++, it is enabled by default. */
993 if (warn_enum_compare
== -1)
994 warn_enum_compare
= c_dialect_cxx () ? 1 : 0;
996 /* -Wpacked-bitfield-compat is on by default for the C languages. The
997 warning is issued in stor-layout.c which is not part of the front-end so
998 we need to selectively turn it on here. */
999 if (warn_packed_bitfield_compat
== -1)
1000 warn_packed_bitfield_compat
= 1;
1002 /* Special format checking options don't work without -Wformat; warn if
1006 warning (OPT_Wformat_y2k
,
1007 "-Wformat-y2k ignored without -Wformat");
1008 warning (OPT_Wformat_extra_args
,
1009 "-Wformat-extra-args ignored without -Wformat");
1010 warning (OPT_Wformat_zero_length
,
1011 "-Wformat-zero-length ignored without -Wformat");
1012 warning (OPT_Wformat_nonliteral
,
1013 "-Wformat-nonliteral ignored without -Wformat");
1014 warning (OPT_Wformat_contains_nul
,
1015 "-Wformat-contains-nul ignored without -Wformat");
1016 warning (OPT_Wformat_security
,
1017 "-Wformat-security ignored without -Wformat");
1020 if (warn_implicit
== -1)
1023 if (warn_implicit_int
== -1)
1024 warn_implicit_int
= 0;
1026 /* -Wimplicit-function-declaration is enabled by default for C99. */
1027 if (warn_implicit_function_declaration
== -1)
1028 warn_implicit_function_declaration
= flag_isoc99
;
1030 /* If we're allowing C++0x constructs, don't warn about C++0x
1031 compatibility problems. */
1032 if (cxx_dialect
== cxx0x
)
1033 warn_cxx0x_compat
= 0;
1035 if (flag_preprocess_only
)
1037 /* Open the output now. We must do so even if flag_no_output is
1038 on, because there may be other output than from the actual
1039 preprocessing (e.g. from -dM). */
1040 if (out_fname
[0] == '\0')
1041 out_stream
= stdout
;
1043 out_stream
= fopen (out_fname
, "w");
1045 if (out_stream
== NULL
)
1047 fatal_error ("opening output file %s: %m", out_fname
);
1051 if (num_in_fnames
> 1)
1052 error ("too many filenames given. Type %s --help for usage",
1055 init_pp_output (out_stream
);
1061 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1062 input_location
= UNKNOWN_LOCATION
;
1065 cb
= cpp_get_callbacks (parse_in
);
1066 cb
->file_change
= cb_file_change
;
1067 cb
->dir_change
= cb_dir_change
;
1068 cpp_post_options (parse_in
);
1070 input_location
= UNKNOWN_LOCATION
;
1072 *pfilename
= this_input_filename
1073 = cpp_read_main_file (parse_in
, in_fnames
[0]);
1074 /* Don't do any compilation or preprocessing if there is no input file. */
1075 if (this_input_filename
== NULL
)
1081 if (flag_working_directory
1082 && flag_preprocess_only
&& !flag_no_line_commands
)
1083 pp_dir_change (parse_in
, get_src_pwd ());
1085 return flag_preprocess_only
;
1088 /* Front end initialization common to C, ObjC and C++. */
1090 c_common_init (void)
1092 /* Set up preprocessor arithmetic. Must be done after call to
1093 c_common_nodes_and_builtins for type nodes to be good. */
1094 cpp_opts
->precision
= TYPE_PRECISION (intmax_type_node
);
1095 cpp_opts
->char_precision
= TYPE_PRECISION (char_type_node
);
1096 cpp_opts
->int_precision
= TYPE_PRECISION (integer_type_node
);
1097 cpp_opts
->wchar_precision
= TYPE_PRECISION (wchar_type_node
);
1098 cpp_opts
->unsigned_wchar
= TYPE_UNSIGNED (wchar_type_node
);
1099 cpp_opts
->bytes_big_endian
= BYTES_BIG_ENDIAN
;
1101 /* This can't happen until after wchar_precision and bytes_big_endian
1103 cpp_init_iconv (parse_in
);
1106 c_common_print_pch_checksum (stderr
);
1108 /* Has to wait until now so that cpplib has its hash table. */
1111 if (flag_preprocess_only
)
1114 preprocess_file (parse_in
);
1121 /* Initialize the integrated preprocessor after debug output has been
1122 initialized; loop over each input file. */
1124 c_common_parse_file (int set_yydebug
)
1132 warning(0, "The C parser does not support -dy, option ignored");
1136 "The Objective-C parser does not support -dy, option ignored");
1139 warning(0, "The C++ parser does not support -dy, option ignored");
1143 "The Objective-C++ parser does not support -dy, option ignored");
1158 /* And end the main input file, if the debug writer wants it */
1159 if (debug_hooks
->start_end_main_source_file
)
1160 (*debug_hooks
->end_source_file
) (0);
1161 if (++i
>= num_in_fnames
)
1163 cpp_undef_all (parse_in
);
1164 cpp_clear_file_cache (parse_in
);
1166 = cpp_read_main_file (parse_in
, in_fnames
[i
]);
1167 /* If an input file is missing, abandon further compilation.
1168 cpplib has issued a diagnostic. */
1169 if (!this_input_filename
)
1174 /* Common finish hook for the C, ObjC and C++ front ends. */
1176 c_common_finish (void)
1178 FILE *deps_stream
= NULL
;
1180 /* Don't write the deps file if there are errors. */
1181 if (cpp_opts
->deps
.style
!= DEPS_NONE
&& !seen_error ())
1183 /* If -M or -MM was seen without -MF, default output to the
1186 deps_stream
= out_stream
;
1189 deps_stream
= fopen (deps_file
, deps_append
? "a": "w");
1191 fatal_error ("opening dependency file %s: %m", deps_file
);
1195 /* For performance, avoid tearing down cpplib's internal structures
1196 with cpp_destroy (). */
1197 cpp_finish (parse_in
, deps_stream
);
1199 if (deps_stream
&& deps_stream
!= out_stream
1200 && (ferror (deps_stream
) || fclose (deps_stream
)))
1201 fatal_error ("closing dependency file %s: %m", deps_file
);
1203 if (out_stream
&& (ferror (out_stream
) || fclose (out_stream
)))
1204 fatal_error ("when writing output to %s: %m", out_fname
);
1207 /* Either of two environment variables can specify output of
1208 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1209 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1210 and DEPS_TARGET is the target to mention in the deps. They also
1211 result in dependency information being appended to the output file
1212 rather than overwriting it, and like Sun's compiler
1213 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1215 check_deps_environment_vars (void)
1219 GET_ENVIRONMENT (spec
, "DEPENDENCIES_OUTPUT");
1221 cpp_opts
->deps
.style
= DEPS_USER
;
1224 GET_ENVIRONMENT (spec
, "SUNPRO_DEPENDENCIES");
1227 cpp_opts
->deps
.style
= DEPS_SYSTEM
;
1228 cpp_opts
->deps
.ignore_main_file
= true;
1234 /* Find the space before the DEPS_TARGET, if there is one. */
1235 char *s
= strchr (spec
, ' ');
1238 /* Let the caller perform MAKE quoting. */
1239 defer_opt (OPT_MT
, s
+ 1);
1243 /* Command line -MF overrides environment variables and default. */
1252 /* Handle deferred command line switches. */
1254 handle_deferred_opts (void)
1259 /* Avoid allocating the deps buffer if we don't need it.
1260 (This flag may be true without there having been -MT or -MQ
1261 options, but we'll still need the deps buffer.) */
1265 deps
= cpp_get_deps (parse_in
);
1267 for (i
= 0; i
< deferred_count
; i
++)
1269 struct deferred_opt
*opt
= &deferred_opts
[i
];
1271 if (opt
->code
== OPT_MT
|| opt
->code
== OPT_MQ
)
1272 deps_add_target (deps
, opt
->arg
, opt
->code
== OPT_MQ
);
1276 /* These settings are appropriate for GCC, but not necessarily so for
1277 cpplib as a library. */
1279 sanitize_cpp_opts (void)
1281 /* If we don't know what style of dependencies to output, complain
1282 if any other dependency switches have been given. */
1283 if (deps_seen
&& cpp_opts
->deps
.style
== DEPS_NONE
)
1284 error ("to generate dependencies you must specify either -M or -MM");
1286 /* -dM and dependencies suppress normal output; do it here so that
1287 the last -d[MDN] switch overrides earlier ones. */
1288 if (flag_dump_macros
== 'M')
1291 /* By default, -fdirectives-only implies -dD. This allows subsequent phases
1292 to perform proper macro expansion. */
1293 if (cpp_opts
->directives_only
&& !cpp_opts
->preprocessed
&& !flag_dump_macros
)
1294 flag_dump_macros
= 'D';
1296 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1297 -dM since at least glibc relies on -M -dM to work. */
1298 /* Also, flag_no_output implies flag_no_line_commands, always. */
1301 if (flag_dump_macros
!= 'M')
1302 flag_dump_macros
= 0;
1303 flag_dump_includes
= 0;
1304 flag_no_line_commands
= 1;
1306 else if (cpp_opts
->deps
.missing_files
)
1307 error ("-MG may only be used with -M or -MM");
1309 cpp_opts
->unsigned_char
= !flag_signed_char
;
1310 cpp_opts
->stdc_0_in_system_headers
= STDC_0_IN_SYSTEM_HEADERS
;
1312 /* Wlong-long is disabled by default. It is enabled by:
1313 [-pedantic | -Wtraditional] -std=[gnu|c]++98 ; or
1314 [-pedantic | -Wtraditional] -std=non-c99 .
1316 Either -Wlong-long or -Wno-long-long override any other settings. */
1317 if (warn_long_long
== -1)
1318 warn_long_long
= ((pedantic
|| warn_traditional
)
1319 && (c_dialect_cxx () ? cxx_dialect
== cxx98
: !flag_isoc99
));
1320 cpp_opts
->cpp_warn_long_long
= warn_long_long
;
1322 /* Similarly with -Wno-variadic-macros. No check for c99 here, since
1323 this also turns off warnings about GCCs extension. */
1324 cpp_opts
->warn_variadic_macros
1325 = warn_variadic_macros
&& (pedantic
|| warn_traditional
);
1327 /* If we're generating preprocessor output, emit current directory
1328 if explicitly requested or if debugging information is enabled.
1329 ??? Maybe we should only do it for debugging formats that
1330 actually output the current directory? */
1331 if (flag_working_directory
== -1)
1332 flag_working_directory
= (debug_info_level
!= DINFO_LEVEL_NONE
);
1334 if (cpp_opts
->directives_only
)
1336 if (warn_unused_macros
)
1337 error ("-fdirectives-only is incompatible with -Wunused_macros");
1338 if (cpp_opts
->traditional
)
1339 error ("-fdirectives-only is incompatible with -traditional");
1343 /* Add include path with a prefix at the front of its name. */
1345 add_prefixed_path (const char *suffix
, size_t chain
)
1349 size_t prefix_len
, suffix_len
;
1351 suffix_len
= strlen (suffix
);
1352 prefix
= iprefix
? iprefix
: cpp_GCC_INCLUDE_DIR
;
1353 prefix_len
= iprefix
? strlen (iprefix
) : cpp_GCC_INCLUDE_DIR_len
;
1355 path
= (char *) xmalloc (prefix_len
+ suffix_len
+ 1);
1356 memcpy (path
, prefix
, prefix_len
);
1357 memcpy (path
+ prefix_len
, suffix
, suffix_len
);
1358 path
[prefix_len
+ suffix_len
] = '\0';
1360 add_path (path
, chain
, 0, false);
1363 /* Handle -D, -U, -A, -imacros, and the first -include. */
1365 finish_options (void)
1367 if (!cpp_opts
->preprocessed
)
1371 cb_file_change (parse_in
,
1372 linemap_add (line_table
, LC_RENAME
, 0,
1373 _("<built-in>"), 0));
1375 cpp_init_builtins (parse_in
, flag_hosted
);
1376 c_cpp_builtins (parse_in
);
1378 /* We're about to send user input to cpplib, so make it warn for
1379 things that we previously (when we sent it internal definitions)
1380 told it to not warn.
1382 C99 permits implementation-defined characters in identifiers.
1383 The documented meaning of -std= is to turn off extensions that
1384 conflict with the specified standard, and since a strictly
1385 conforming program cannot contain a '$', we do not condition
1386 their acceptance on the -std= setting. */
1387 cpp_opts
->warn_dollars
= (cpp_opts
->cpp_pedantic
&& !cpp_opts
->c99
);
1389 cb_file_change (parse_in
,
1390 linemap_add (line_table
, LC_RENAME
, 0,
1391 _("<command-line>"), 0));
1393 for (i
= 0; i
< deferred_count
; i
++)
1395 struct deferred_opt
*opt
= &deferred_opts
[i
];
1397 if (opt
->code
== OPT_D
)
1398 cpp_define (parse_in
, opt
->arg
);
1399 else if (opt
->code
== OPT_U
)
1400 cpp_undef (parse_in
, opt
->arg
);
1401 else if (opt
->code
== OPT_A
)
1403 if (opt
->arg
[0] == '-')
1404 cpp_unassert (parse_in
, opt
->arg
+ 1);
1406 cpp_assert (parse_in
, opt
->arg
);
1410 /* Start the main input file, if the debug writer wants it. */
1411 if (debug_hooks
->start_end_main_source_file
1412 && !flag_preprocess_only
)
1413 (*debug_hooks
->start_source_file
) (0, this_input_filename
);
1415 /* Handle -imacros after -D and -U. */
1416 for (i
= 0; i
< deferred_count
; i
++)
1418 struct deferred_opt
*opt
= &deferred_opts
[i
];
1420 if (opt
->code
== OPT_imacros
1421 && cpp_push_include (parse_in
, opt
->arg
))
1423 /* Disable push_command_line_include callback for now. */
1424 include_cursor
= deferred_count
+ 1;
1425 cpp_scan_nooutput (parse_in
);
1431 if (cpp_opts
->directives_only
)
1432 cpp_init_special_builtins (parse_in
);
1434 /* Start the main input file, if the debug writer wants it. */
1435 if (debug_hooks
->start_end_main_source_file
1436 && !flag_preprocess_only
)
1437 (*debug_hooks
->start_source_file
) (0, this_input_filename
);
1441 push_command_line_include ();
1444 /* Give CPP the next file given by -include, if any. */
1446 push_command_line_include (void)
1448 while (include_cursor
< deferred_count
)
1450 struct deferred_opt
*opt
= &deferred_opts
[include_cursor
++];
1452 if (!cpp_opts
->preprocessed
&& opt
->code
== OPT_include
1453 && cpp_push_include (parse_in
, opt
->arg
))
1457 if (include_cursor
== deferred_count
)
1460 /* -Wunused-macros should only warn about macros defined hereafter. */
1461 cpp_opts
->warn_unused_macros
= warn_unused_macros
;
1462 /* Restore the line map from <command line>. */
1463 if (!cpp_opts
->preprocessed
)
1464 cpp_change_file (parse_in
, LC_RENAME
, this_input_filename
);
1466 /* Set this here so the client can change the option if it wishes,
1467 and after stacking the main file so we don't trace the main file. */
1468 line_table
->trace_includes
= cpp_opts
->print_include_names
;
1472 /* File change callback. Has to handle -include files. */
1474 cb_file_change (cpp_reader
* ARG_UNUSED (pfile
),
1475 const struct line_map
*new_map
)
1477 if (flag_preprocess_only
)
1478 pp_file_change (new_map
);
1480 fe_file_change (new_map
);
1482 if (new_map
== 0 || (new_map
->reason
== LC_LEAVE
&& MAIN_FILE_P (new_map
)))
1483 push_command_line_include ();
1487 cb_dir_change (cpp_reader
* ARG_UNUSED (pfile
), const char *dir
)
1489 if (!set_src_pwd (dir
))
1490 warning (0, "too late for # directive to set debug directory");
1493 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1494 extensions if ISO). There is no concept of gnu94. */
1496 set_std_c89 (int c94
, int iso
)
1498 cpp_set_lang (parse_in
, c94
? CLK_STDC94
: iso
? CLK_STDC89
: CLK_GNUC89
);
1501 flag_no_gnu_keywords
= iso
;
1502 flag_no_nonansi_builtin
= iso
;
1508 /* Set the C 99 standard (without GNU extensions if ISO). */
1510 set_std_c99 (int iso
)
1512 cpp_set_lang (parse_in
, iso
? CLK_STDC99
: CLK_GNUC99
);
1514 flag_no_nonansi_builtin
= iso
;
1521 /* Set the C 1X standard draft (without GNU extensions if ISO). */
1523 set_std_c1x (int iso
)
1525 cpp_set_lang (parse_in
, iso
? CLK_STDC1X
: CLK_GNUC1X
);
1527 flag_no_nonansi_builtin
= iso
;
1534 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1536 set_std_cxx98 (int iso
)
1538 cpp_set_lang (parse_in
, iso
? CLK_CXX98
: CLK_GNUCXX
);
1539 flag_no_gnu_keywords
= iso
;
1540 flag_no_nonansi_builtin
= iso
;
1542 cxx_dialect
= cxx98
;
1545 /* Set the C++ 0x working draft "standard" (without GNU extensions if ISO). */
1547 set_std_cxx0x (int iso
)
1549 cpp_set_lang (parse_in
, iso
? CLK_CXX0X
: CLK_GNUCXX0X
);
1550 flag_no_gnu_keywords
= iso
;
1551 flag_no_nonansi_builtin
= iso
;
1553 cxx_dialect
= cxx0x
;
1556 /* Args to -d specify what to dump. Silently ignore
1557 unrecognized options; they may be aimed at toplev.c. */
1559 handle_OPT_d (const char *arg
)
1563 while ((c
= *arg
++) != '\0')
1566 case 'M': /* Dump macros only. */
1567 case 'N': /* Dump names. */
1568 case 'D': /* Dump definitions. */
1569 case 'U': /* Dump used macros. */
1570 flag_dump_macros
= c
;
1574 flag_dump_includes
= 1;