Mercurial > hg > CbC > CbC_gcc
diff gcc/c-opts.c @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children |
line wrap: on
line diff
--- a/gcc/c-opts.c Fri Feb 12 23:41:23 2010 +0900 +++ b/gcc/c-opts.c Mon May 24 12:47:05 2010 +0900 @@ -1,5 +1,5 @@ /* C/ObjC/C++ command line option handling. - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Neil Booth. @@ -22,14 +22,12 @@ #include "config.h" #include "system.h" #include "coretypes.h" -#include "tm.h" #include "tree.h" #include "c-common.h" #include "c-pragma.h" #include "flags.h" #include "toplev.h" #include "langhooks.h" -#include "tree-inline.h" #include "diagnostic.h" #include "intl.h" #include "cppdefault.h" @@ -38,8 +36,7 @@ #include "opts.h" #include "options.h" #include "mkdeps.h" -#include "target.h" -#include "tm_p.h" +#include "target.h" /* For gcc_targetcm. */ #include "c-tree.h" /* For c_cpp_error. */ #ifndef DOLLARS_IN_IDENTIFIERS @@ -106,12 +103,12 @@ /* Number of deferred options scanned for -include. */ static size_t include_cursor; -static void set_Wimplicit (int); static void handle_OPT_d (const char *); static void set_std_cxx98 (int); static void set_std_cxx0x (int); static void set_std_c89 (int, int); static void set_std_c99 (int); +static void set_std_c1x (int); static void check_deps_environment_vars (void); static void handle_deferred_opts (void); static void sanitize_cpp_opts (void); @@ -134,6 +131,10 @@ const char *arg; } *deferred_opts; + +static const unsigned int +c_family_lang_mask = (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX); + /* Complain that switch CODE expects an argument but none was provided. OPT was the command-line option. Return FALSE to get the default message in opts.c, TRUE if we provide a specialized @@ -196,6 +197,90 @@ deferred_count++; } +/* -Werror= may set a warning option to enable a warning that is emitted + by the preprocessor. Set any corresponding flag in cpp_opts. */ + +static void +warning_as_error_callback (int option_index) +{ + switch (option_index) + { + default: + /* Ignore options not associated with the preprocessor. */ + break; + + case OPT_Wdeprecated: + cpp_opts->warn_deprecated = 1; + break; + + case OPT_Wcomment: + case OPT_Wcomments: + cpp_opts->warn_comments = 1; + break; + + case OPT_Wtrigraphs: + cpp_opts->warn_trigraphs = 1; + break; + + case OPT_Wmultichar: + cpp_opts->warn_multichar = 1; + break; + + case OPT_Wtraditional: + cpp_opts->warn_traditional = 1; + break; + + case OPT_Wlong_long: + cpp_opts->warn_long_long = 1; + break; + + case OPT_Wendif_labels: + cpp_opts->warn_endif_labels = 1; + break; + + case OPT_Wvariadic_macros: + /* Set the local flag that is used later to update cpp_opts. */ + warn_variadic_macros = 1; + break; + + case OPT_Wbuiltin_macro_redefined: + cpp_opts->warn_builtin_macro_redefined = 1; + break; + + case OPT_Wundef: + cpp_opts->warn_undef = 1; + break; + + case OPT_Wunused_macros: + /* Set the local flag that is used later to update cpp_opts. */ + warn_unused_macros = 1; + break; + + case OPT_Wc___compat: + /* Add warnings in the same way as c_common_handle_option below. */ + if (warn_enum_compare == -1) + warn_enum_compare = 1; + if (warn_jump_misses_init == -1) + warn_jump_misses_init = 1; + cpp_opts->warn_cxx_operator_names = 1; + break; + + case OPT_Wnormalized_: + inform (input_location, "-Werror=normalized=: Set -Wnormalized=nfc"); + cpp_opts->warn_normalize = normalized_C; + break; + + case OPT_Winvalid_pch: + cpp_opts->warn_invalid_pch = 1; + break; + + case OPT_Wcpp: + /* Handled by standard diagnostics using the option's associated + boolean variable. */ + break; + } +} + /* Common initialization before parsing options. */ unsigned int c_common_init_options (unsigned int argc, const char **argv) @@ -204,6 +289,9 @@ unsigned int i, result; struct cpp_callbacks *cb; + /* Register callback for warnings enabled by -Werror=. */ + register_warning_as_error_callback (warning_as_error_callback); + /* This is conditionalized only because that is the way the front ends used to do it. Maybe this should be unconditional? */ if (c_dialect_cxx ()) @@ -261,7 +349,8 @@ invalid, a negative number to prevent language-independent processing in toplev.c (a hack necessary for the short-term). */ int -c_common_handle_option (size_t scode, const char *arg, int value) +c_common_handle_option (size_t scode, const char *arg, int value, + int kind) { const struct cl_option *option = &cl_options[scode]; enum opt_code code = (enum opt_code) scode; @@ -274,7 +363,7 @@ switch (code) { default: - if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX)) + if (cl_options[code].flags & c_family_lang_mask) { if ((option->flags & CL_TARGET) && ! targetcm.handle_c_option (scode, arg, value)) @@ -383,7 +472,7 @@ case OPT_Wall: warn_unused = value; set_Wformat (value); - set_Wimplicit (value); + handle_option (OPT_Wimplicit, value, NULL, c_family_lang_mask, kind); warn_char_subscripts = value; warn_missing_braces = value; warn_parentheses = value; @@ -481,7 +570,13 @@ break; case OPT_Wimplicit: - set_Wimplicit (value); + gcc_assert (value == 0 || value == 1); + if (warn_implicit_int == -1) + handle_option (OPT_Wimplicit_int, value, NULL, + c_family_lang_mask, kind); + if (warn_implicit_function_declaration == -1) + handle_option (OPT_Wimplicit_function_declaration, value, NULL, + c_family_lang_mask, kind); break; case OPT_Wimport: @@ -801,6 +896,8 @@ break; case OPT_ftemplate_depth_: + /* Kept for backwards compatibility. */ + case OPT_ftemplate_depth_eq: max_tinst_depth = value; break; @@ -950,6 +1047,7 @@ break; case OPT_std_c89: + case OPT_std_c90: case OPT_std_iso9899_1990: case OPT_std_iso9899_199409: if (!preprocessing_asm_p) @@ -957,6 +1055,7 @@ break; case OPT_std_gnu89: + case OPT_std_gnu90: if (!preprocessing_asm_p) set_std_c89 (false /* c94 */, false /* ISO */); break; @@ -975,6 +1074,16 @@ set_std_c99 (false /* ISO */); break; + case OPT_std_c1x: + if (!preprocessing_asm_p) + set_std_c1x (true /* ISO */); + break; + + case OPT_std_gnu1x: + if (!preprocessing_asm_p) + set_std_c1x (false /* ISO */); + break; + case OPT_trigraphs: cpp_opts->trigraphs = 1; break; @@ -1144,6 +1253,12 @@ "-Wformat-security ignored without -Wformat"); } + if (warn_implicit == -1) + warn_implicit = 0; + + if (warn_implicit_int == -1) + warn_implicit_int = 0; + /* -Wimplicit-function-declaration is enabled by default for C99. */ if (warn_implicit_function_declaration == -1) warn_implicit_function_declaration = flag_isoc99; @@ -1270,9 +1385,6 @@ i = 0; for (;;) { - /* Start the main input file, if the debug writer wants it. */ - if (debug_hooks->start_end_main_source_file) - (*debug_hooks->start_source_file) (0, this_input_filename); finish_options (); pch_init (); push_file_scope (); @@ -1531,6 +1643,11 @@ } } + /* Start the main input file, if the debug writer wants it. */ + if (debug_hooks->start_end_main_source_file + && !flag_preprocess_only) + (*debug_hooks->start_source_file) (0, this_input_filename); + /* Handle -imacros after -D and -U. */ for (i = 0; i < deferred_count; i++) { @@ -1545,8 +1662,16 @@ } } } - else if (cpp_opts->directives_only) - cpp_init_special_builtins (parse_in); + else + { + if (cpp_opts->directives_only) + cpp_init_special_builtins (parse_in); + + /* Start the main input file, if the debug writer wants it. */ + if (debug_hooks->start_end_main_source_file + && !flag_preprocess_only) + (*debug_hooks->start_source_file) (0, this_input_filename); + } include_cursor = 0; push_command_line_include (); @@ -1613,6 +1738,7 @@ flag_no_nonansi_builtin = iso; flag_isoc94 = c94; flag_isoc99 = 0; + flag_isoc1x = 0; } /* Set the C 99 standard (without GNU extensions if ISO). */ @@ -1623,6 +1749,20 @@ flag_no_asm = iso; flag_no_nonansi_builtin = iso; flag_iso = iso; + flag_isoc1x = 0; + flag_isoc99 = 1; + flag_isoc94 = 1; +} + +/* Set the C 1X standard draft (without GNU extensions if ISO). */ +static void +set_std_c1x (int iso) +{ + cpp_set_lang (parse_in, iso ? CLK_STDC1X: CLK_GNUC1X); + flag_no_asm = iso; + flag_no_nonansi_builtin = iso; + flag_iso = iso; + flag_isoc1x = 1; flag_isoc99 = 1; flag_isoc94 = 1; } @@ -1649,15 +1789,6 @@ cxx_dialect = cxx0x; } -/* Handle setting implicit to ON. */ -static void -set_Wimplicit (int on) -{ - warn_implicit = on; - warn_implicit_int = on; - warn_implicit_function_declaration = on; -} - /* Args to -d specify what to dump. Silently ignore unrecognized options; they may be aimed at toplev.c. */ static void