Mercurial > hg > CbC > CbC_gcc
diff gcc/c-family/c-opts.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/c-family/c-opts.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/c-family/c-opts.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* C/ObjC/C++ command line option handling. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2018 Free Software Foundation, Inc. Contributed by Neil Booth. This file is part of GCC. @@ -40,6 +40,7 @@ #include "plugin.h" /* For PLUGIN_INCLUDE_FILE event. */ #include "mkdeps.h" #include "dumpfile.h" +#include "file-prefix-map.h" /* add_*_prefix_map() */ #ifndef DOLLARS_IN_IDENTIFIERS # define DOLLARS_IN_IDENTIFIERS true @@ -115,6 +116,8 @@ static void set_std_c89 (int, int); static void set_std_c99 (int); static void set_std_c11 (int); +static void set_std_c17 (int); +static void set_std_c2x (int); static void check_deps_environment_vars (void); static void handle_deferred_opts (void); static void sanitize_cpp_opts (void); @@ -222,7 +225,7 @@ parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89, ident_hash, line_table); cb = cpp_get_callbacks (parse_in); - cb->error = c_cpp_error; + cb->diagnostic = c_cpp_diagnostic; cpp_opts = cpp_get_options (parse_in); cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS; @@ -236,8 +239,8 @@ if (c_language == clk_c) { - /* The default for C is gnu11. */ - set_std_c11 (false /* ISO */); + /* The default for C is gnu17. */ + set_std_c17 (false /* ISO */); /* If preprocessing assembly language, accept any of the C-family front end options since the driver may pass them through. */ @@ -260,7 +263,7 @@ form of an -f or -W option was given. Returns false if the switch was invalid, true if valid. Use HANDLERS in recursive handle_option calls. */ bool -c_common_handle_option (size_t scode, const char *arg, int value, +c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value, int kind, location_t loc, const struct cl_option_handlers *handlers) { @@ -379,16 +382,6 @@ cpp_opts->warn_num_sign_change = value; break; - case OPT_Walloca_larger_than_: - if (!value) - inform (loc, "-Walloca-larger-than=0 is meaningless"); - break; - - case OPT_Wvla_larger_than_: - if (!value) - inform (loc, "-Wvla-larger-than=0 is meaningless"); - break; - case OPT_Wunknown_pragmas: /* Set to greater than 1, so that even unknown pragmas in system headers will be warned about. */ @@ -415,8 +408,6 @@ value = 2; } warn_abi_version = value; - if (flag_abi_compat_version == -1) - flag_abi_compat_version = value; break; case OPT_fcanonical_system_headers: @@ -447,6 +438,10 @@ cpp_opts->dollars_in_ident = value; break; + case OPT_fmacro_prefix_map_: + add_macro_prefix_map (arg); + break; + case OPT_ffreestanding: value = !value; /* Fall through. */ @@ -675,6 +670,26 @@ set_std_c11 (false /* ISO */); break; + case OPT_std_c17: + if (!preprocessing_asm_p) + set_std_c17 (true /* ISO */); + break; + + case OPT_std_gnu17: + if (!preprocessing_asm_p) + set_std_c17 (false /* ISO */); + break; + + case OPT_std_c2x: + if (!preprocessing_asm_p) + set_std_c2x (true /* ISO */); + break; + + case OPT_std_gnu2x: + if (!preprocessing_asm_p) + set_std_c2x (false /* ISO */); + break; + case OPT_trigraphs: cpp_opts->trigraphs = 1; break; @@ -899,31 +914,49 @@ if (flag_declone_ctor_dtor == -1) flag_declone_ctor_dtor = optimize_size; - if (warn_abi_version == -1) - { - if (flag_abi_compat_version != -1) - warn_abi_version = flag_abi_compat_version; - else - warn_abi_version = 0; - } - if (flag_abi_compat_version == 1) { warning (0, "%<-fabi-compat-version=1%> is not supported, using =2"); flag_abi_compat_version = 2; } - else if (flag_abi_compat_version == -1) + + /* Change flag_abi_version to be the actual current ABI level, for the + benefit of c_cpp_builtins, and to make comparison simpler. */ + const int latest_abi_version = 13; + /* Generate compatibility aliases for ABI v11 (7.1) by default. */ + const int abi_compat_default = 11; + +#define clamp(X) if (X == 0 || X > latest_abi_version) X = latest_abi_version + clamp (flag_abi_version); + clamp (warn_abi_version); + clamp (flag_abi_compat_version); +#undef clamp + + /* Default -Wabi= or -fabi-compat-version= from each other. */ + if (warn_abi_version == -1 && flag_abi_compat_version != -1) + warn_abi_version = flag_abi_compat_version; + else if (flag_abi_compat_version == -1 && warn_abi_version != -1) + flag_abi_compat_version = warn_abi_version; + else if (warn_abi_version == -1 && flag_abi_compat_version == -1) { - /* Generate compatibility aliases for ABI v11 (7.1) by default. */ - flag_abi_compat_version - = (flag_abi_version == 0 ? 11 : 0); + warn_abi_version = latest_abi_version; + if (flag_abi_version == latest_abi_version) + { + auto_diagnostic_group d; + if (warning (OPT_Wabi, "-Wabi won't warn about anything")) + { + inform (input_location, "-Wabi warns about differences " + "from the most up-to-date ABI, which is also used " + "by default"); + inform (input_location, "use e.g. -Wabi=11 to warn about " + "changes from GCC 7"); + } + flag_abi_compat_version = abi_compat_default; + } + else + flag_abi_compat_version = latest_abi_version; } - /* Change flag_abi_version to be the actual current ABI level for the - benefit of c_cpp_builtins. */ - if (flag_abi_version == 0) - flag_abi_version = 12; - /* By default, enable the new inheriting constructor semantics along with ABI 11. New and old should coexist fine, but it is a change in what artificial symbols are generated. */ @@ -978,6 +1011,10 @@ flag_extern_tls_init = 1; } + /* Enable by default only for C++ and C++ with ObjC extensions. */ + if (warn_return_type == -1 && c_dialect_cxx ()) + warn_return_type = 1; + if (num_in_fnames > 1) error ("too many filenames given. Type %s --help for usage", progname); @@ -1528,6 +1565,7 @@ flag_isoc94 = c94; flag_isoc99 = 0; flag_isoc11 = 0; + flag_isoc2x = 0; lang_hooks.name = "GNU C89"; } @@ -1539,6 +1577,7 @@ flag_no_asm = iso; flag_no_nonansi_builtin = iso; flag_iso = iso; + flag_isoc2x = 0; flag_isoc11 = 0; flag_isoc99 = 1; flag_isoc94 = 1; @@ -1553,12 +1592,44 @@ flag_no_asm = iso; flag_no_nonansi_builtin = iso; flag_iso = iso; + flag_isoc2x = 0; flag_isoc11 = 1; flag_isoc99 = 1; flag_isoc94 = 1; lang_hooks.name = "GNU C11"; } +/* Set the C 17 standard (without GNU extensions if ISO). */ +static void +set_std_c17 (int iso) +{ + cpp_set_lang (parse_in, iso ? CLK_STDC17: CLK_GNUC17); + flag_no_asm = iso; + flag_no_nonansi_builtin = iso; + flag_iso = iso; + flag_isoc2x = 0; + flag_isoc11 = 1; + flag_isoc99 = 1; + flag_isoc94 = 1; + lang_hooks.name = "GNU C17"; +} + +/* Set the C 2X standard (without GNU extensions if ISO). */ +static void +set_std_c2x (int iso) +{ + cpp_set_lang (parse_in, iso ? CLK_STDC2X: CLK_GNUC2X); + flag_no_asm = iso; + flag_no_nonansi_builtin = iso; + flag_iso = iso; + flag_isoc2x = 1; + flag_isoc11 = 1; + flag_isoc99 = 1; + flag_isoc94 = 1; + lang_hooks.name = "GNU C2X"; +} + + /* Set the C++ 98 standard (without GNU extensions if ISO). */ static void set_std_cxx98 (int iso)