LCOV - code coverage report
Current view: top level - gcc/c-family - c-opts.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 89.8 % 1047 940
Test Date: 2026-02-28 14:20:25 Functions: 94.6 % 37 35
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* C/ObjC/C++ command line option handling.
       2              :    Copyright (C) 2002-2026 Free Software Foundation, Inc.
       3              :    Contributed by Neil Booth.
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify it under
       8              : the terms of the GNU General Public License as published by the Free
       9              : Software Foundation; either version 3, or (at your option) any later
      10              : version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15              : for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : #define INCLUDE_VECTOR
      22              : #include "config.h"
      23              : #include "system.h"
      24              : #include "coretypes.h"
      25              : #include "tm.h"
      26              : #include "target.h"
      27              : #include "c-target.h"
      28              : #include "c-common.h"
      29              : #include "memmodel.h"
      30              : #include "tm_p.h"             /* For C_COMMON_OVERRIDE_OPTIONS.  */
      31              : #include "diagnostic.h"
      32              : #include "c-pragma.h"
      33              : #include "flags.h"
      34              : #include "toplev.h"
      35              : #include "langhooks.h"
      36              : #include "diagnostics/macro-unwinding.h" /* for virt_loc_aware_diagnostic_finalizer */
      37              : #include "intl.h"
      38              : #include "cppdefault.h"
      39              : #include "incpath.h"
      40              : #include "debug.h"            /* For debug_hooks.  */
      41              : #include "opts.h"
      42              : #include "plugin.h"           /* For PLUGIN_INCLUDE_FILE event.  */
      43              : #include "mkdeps.h"
      44              : #include "dumpfile.h"
      45              : #include "file-prefix-map.h"    /* add_*_prefix_map()  */
      46              : #include "context.h"
      47              : #include "diagnostics/text-sink.h"
      48              : 
      49              : #ifndef DOLLARS_IN_IDENTIFIERS
      50              : # define DOLLARS_IN_IDENTIFIERS true
      51              : #endif
      52              : 
      53              : #ifndef TARGET_SYSTEM_ROOT
      54              : # define TARGET_SYSTEM_ROOT NULL
      55              : #endif
      56              : 
      57              : #ifndef TARGET_OPTF
      58              : #define TARGET_OPTF(ARG)
      59              : #endif
      60              : 
      61              : /* CPP's options.  */
      62              : cpp_options *cpp_opts;
      63              : 
      64              : /* Input filename.  */
      65              : static const char *this_input_filename;
      66              : 
      67              : /* Filename and stream for preprocessed output.  */
      68              : static const char *out_fname;
      69              : static FILE *out_stream;
      70              : 
      71              : /* Append dependencies to deps_file.  */
      72              : static bool deps_append;
      73              : 
      74              : /* If dependency switches (-MF etc.) have been given.  */
      75              : static bool deps_seen;
      76              : 
      77              : /* If -v seen.  */
      78              : static bool verbose;
      79              : 
      80              : /* Dependency output file.  */
      81              : static const char *deps_file;
      82              : 
      83              : /* Structured dependency output file.  */
      84              : static const char *fdeps_file;
      85              : 
      86              : /* The prefix given by -iprefix, if any.  */
      87              : static const char *iprefix;
      88              : 
      89              : /* The multilib directory given by -imultilib, if any.  */
      90              : static const char *imultilib;
      91              : 
      92              : /* The system root, if any.  Overridden by -isysroot.  */
      93              : static const char *sysroot = TARGET_SYSTEM_ROOT;
      94              : 
      95              : /* Zero disables all standard directories for headers.  */
      96              : static bool std_inc = true;
      97              : 
      98              : /* Zero disables the C++-specific standard directories for headers.  */
      99              : static bool std_cxx_inc = true;
     100              : 
     101              : /* If the quote chain has been split by -I-.  */
     102              : static bool quote_chain_split;
     103              : 
     104              : /* Number of deferred options.  */
     105              : static size_t deferred_count;
     106              : 
     107              : /* Number of deferred options scanned for -include.  */
     108              : static size_t include_cursor;
     109              : 
     110              : /* Whether any standard preincluded header has been preincluded.  */
     111              : static bool done_preinclude;
     112              : 
     113              : static void handle_OPT_d (const char *);
     114              : static void set_std_cxx98 (int);
     115              : static void set_std_cxx11 (int);
     116              : static void set_std_cxx14 (int);
     117              : static void set_std_cxx17 (int);
     118              : static void set_std_cxx20 (int);
     119              : static void set_std_cxx23 (int);
     120              : static void set_std_cxx26 (int);
     121              : static void set_std_c89 (int, int);
     122              : static void set_std_c99 (int);
     123              : static void set_std_c11 (int);
     124              : static void set_std_c17 (int);
     125              : static void set_std_c23 (int);
     126              : static void set_std_c2y (int);
     127              : static void check_deps_environment_vars (void);
     128              : static void handle_deferred_opts (void);
     129              : static void sanitize_cpp_opts (void);
     130              : static void add_prefixed_path (const char *, incpath_kind);
     131              : static void push_command_line_include (void);
     132              : static void cb_file_change (cpp_reader *, const line_map_ordinary *);
     133              : static void cb_dir_change (cpp_reader *, const char *);
     134              : static void c_finish_options (void);
     135              : 
     136              : #ifndef STDC_0_IN_SYSTEM_HEADERS
     137              : #define STDC_0_IN_SYSTEM_HEADERS 0
     138              : #endif
     139              : 
     140              : /* Holds switches parsed by c_common_handle_option (), but whose
     141              :    handling is deferred to c_common_post_options ().  */
     142              : static void defer_opt (enum opt_code, const char *);
     143              : static struct deferred_opt
     144              : {
     145              :   enum opt_code code;
     146              :   const char *arg;
     147              : } *deferred_opts;
     148              : 
     149              : 
     150              : extern const unsigned int
     151              : c_family_lang_mask = (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX);
     152              : 
     153              : /* Defer option CODE with argument ARG.  */
     154              : static void
     155       179014 : defer_opt (enum opt_code code, const char *arg)
     156              : {
     157       179014 :   deferred_opts[deferred_count].code = code;
     158       179014 :   deferred_opts[deferred_count].arg = arg;
     159       179014 :   deferred_count++;
     160       179014 : }
     161              : 
     162              : /* Return language mask for option parsing.  */
     163              : unsigned int
     164      6373141 : c_common_option_lang_mask (void)
     165              : {
     166      6373141 :   static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
     167              : 
     168      6373141 :   return lang_flags[c_language];
     169              : }
     170              : 
     171              : /* Diagnostic finalizer for C/C++/Objective-C/Objective-C++.  */
     172              : static void
     173       314283 : c_diagnostic_text_finalizer (diagnostics::text_sink &text_output,
     174              :                              const diagnostics::diagnostic_info *diagnostic,
     175              :                              enum diagnostics::kind)
     176              : {
     177       314283 :   pretty_printer *const pp = text_output.get_printer ();
     178       314283 :   char *saved_prefix = pp_take_prefix (pp);
     179       314283 :   pp_set_prefix (pp, text_output.build_indent_prefix (false));
     180       314283 :   pp_newline (pp);
     181       314283 :   diagnostic_show_locus (&text_output.get_context (),
     182       314283 :                          text_output.get_source_printing_options (),
     183       314283 :                          diagnostic->m_richloc, diagnostic->m_kind, pp);
     184              :   /* By default print macro expansion contexts in the diagnostic
     185              :      finalizer -- for tokens resulting from macro expansion.  */
     186       314283 :   diagnostics::virt_loc_aware_text_finalizer (text_output, diagnostic);
     187       314283 :   pp_set_prefix (pp, saved_prefix);
     188       314283 :   pp_flush (pp);
     189       314283 : }
     190              : 
     191              : /* Common default settings for diagnostics.  */
     192              : void
     193       208458 : c_common_diagnostics_set_defaults (diagnostics::context *context)
     194              : {
     195       208458 :   diagnostics::text_finalizer (context) = c_diagnostic_text_finalizer;
     196       208458 :   context->set_permissive_option (OPT_fpermissive);
     197       208458 : }
     198              : 
     199              : /* Input charset configuration for diagnostics.  */
     200              : static const char *
     201        62396 : c_common_input_charset_cb (const char * /*filename*/)
     202              : {
     203        62396 :   const char *cs = cpp_opts->input_charset;
     204        62396 :   return cpp_input_conversion_is_trivial (cs) ? nullptr : cs;
     205              : }
     206              : 
     207              : /* Whether options from all C-family languages should be accepted
     208              :    quietly.  */
     209              : static bool accept_all_c_family_options = false;
     210              : 
     211              : /* Return whether to complain about a wrong-language option.  */
     212              : bool
     213          293 : c_common_complain_wrong_lang_p (const struct cl_option *option)
     214              : {
     215          293 :   if (accept_all_c_family_options
     216            6 :       && (option->flags & c_family_lang_mask))
     217            6 :     return false;
     218              : 
     219              :   return true;
     220              : }
     221              : 
     222              : /* Initialize options structure OPTS.  */
     223              : void
     224     47898059 : c_common_init_options_struct (struct gcc_options *opts)
     225              : {
     226     47898059 :   opts->x_flag_exceptions = c_dialect_cxx ();
     227     47898059 :   opts->x_warn_pointer_arith = c_dialect_cxx ();
     228     47898059 :   opts->x_warn_write_strings = c_dialect_cxx ();
     229     47898059 :   opts->x_flag_warn_unused_result = true;
     230              : 
     231              :   /* By default, C99-like requirements for complex multiply and divide.  */
     232     47898059 :   opts->x_flag_complex_method = 2;
     233     47898059 : }
     234              : 
     235              : /* Common initialization before calling option handlers.  */
     236              : void
     237       208458 : c_common_init_options (unsigned int decoded_options_count,
     238              :                        struct cl_decoded_option *decoded_options)
     239              : {
     240       208458 :   unsigned int i;
     241       208458 :   struct cpp_callbacks *cb;
     242              : 
     243       208458 :   g_string_concat_db
     244       208458 :     = new (ggc_alloc <string_concat_db> ()) string_concat_db ();
     245              : 
     246       319428 :   parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX : CLK_GNUC89,
     247              :                                 ident_hash, line_table, ident_hash_extra);
     248       208458 :   cb = cpp_get_callbacks (parse_in);
     249       208458 :   cb->diagnostic = c_cpp_diagnostic;
     250              : 
     251       208458 :   cpp_opts = cpp_get_options (parse_in);
     252       208458 :   cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
     253       208458 :   cpp_opts->objc = c_dialect_objc ();
     254       208458 :   cpp_opts->deps.modules = true;
     255              : 
     256              :   /* Reset to avoid warnings on internal definitions.  We set it just
     257              :      before passing on command-line options to cpplib.  */
     258       208458 :   cpp_opts->warn_dollars = 0;
     259              : 
     260       208458 :   deferred_opts = XNEWVEC (struct deferred_opt, decoded_options_count);
     261              : 
     262       208458 :   if (c_language == clk_c)
     263              :     {
     264              :       /* The default for C is gnu23.  */
     265       110970 :       set_std_c23 (false /* ISO */);
     266              : 
     267              :       /* If preprocessing assembly language, accept any of the C-family
     268              :          front end options since the driver may pass them through.  */
     269      2836595 :       for (i = 1; i < decoded_options_count; i++)
     270      2615636 :         if (decoded_options[i].opt_index == OPT_lang_asm)
     271              :           {
     272          981 :             accept_all_c_family_options = true;
     273          981 :             break;
     274              :           }
     275              :     }
     276              : 
     277              :   /* Set C++ standard to C++20 if not specified on the command line.  */
     278       208458 :   if (c_dialect_cxx ())
     279        97488 :     set_std_cxx20 (/*ISO*/false);
     280              : 
     281       208458 :   global_dc->get_source_printing_options ().colorize_source_p = true;
     282       208458 : }
     283              : 
     284              : /* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
     285              :    form of an -f or -W option was given.  Returns false if the switch was
     286              :    invalid, true if valid.  Use HANDLERS in recursive handle_option calls.  */
     287              : bool
     288      3333615 : c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
     289              :                         int kind, location_t loc,
     290              :                         const struct cl_option_handlers *handlers)
     291              : {
     292      3333615 :   const struct cl_option *option = &cl_options[scode];
     293      3333615 :   enum opt_code code = (enum opt_code) scode;
     294      3333615 :   bool result = true;
     295              : 
     296              :   /* Prevent resetting the language standard to a C dialect when the driver
     297              :      has already determined that we're looking at assembler input.  */
     298      3333615 :   bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
     299              : 
     300      3333615 :   switch (code)
     301              :     {
     302      1448656 :     default:
     303      1448656 :       if (cl_options[code].flags & c_family_lang_mask)
     304              :         {
     305      1448656 :           if ((option->flags & CL_TARGET)
     306      1448656 :               && ! targetcm.handle_c_option (scode, arg, value))
     307              :             result = false;
     308              :           break;
     309              :         }
     310              :       result = false;
     311              :       break;
     312              : 
     313          428 :     case OPT__output_pch:
     314          428 :       pch_file = arg;
     315          428 :       break;
     316              : 
     317           10 :     case OPT_A:
     318           10 :       defer_opt (code, arg);
     319           10 :       break;
     320              : 
     321           13 :     case OPT_C:
     322           13 :       cpp_opts->discard_comments = 0;
     323           13 :       break;
     324              : 
     325           11 :     case OPT_CC:
     326           11 :       cpp_opts->discard_comments = 0;
     327           11 :       cpp_opts->discard_comments_in_macro_exp = 0;
     328           11 :       break;
     329              : 
     330       163657 :     case OPT_D:
     331       163657 :       defer_opt (code, arg);
     332       163657 :       break;
     333              : 
     334           25 :     case OPT_H:
     335           25 :       cpp_opts->print_include_names = 1;
     336           25 :       break;
     337              : 
     338              :     case OPT_F:
     339              :       TARGET_OPTF (xstrdup (arg));
     340              :       break;
     341              : 
     342       553233 :     case OPT_I:
     343       553233 :       if (strcmp (arg, "-"))
     344       553233 :         add_path (xstrdup (arg), INC_BRACKET, 0, true);
     345              :       else
     346              :         {
     347            0 :           if (quote_chain_split)
     348            0 :             error ("%<-I-%> specified twice");
     349            0 :           quote_chain_split = true;
     350            0 :           split_quote_chain ();
     351            0 :           inform (input_location, "obsolete option %<-I-%> used, "
     352              :                   "please use %<-iquote%> instead");
     353              :         }
     354              :       break;
     355              : 
     356           28 :     case OPT_M:
     357           28 :     case OPT_MM:
     358              :       /* When doing dependencies with -M or -MM, suppress normal
     359              :          preprocessed output, but still do -dM etc. as software
     360              :          depends on this.  Preprocessed output does occur if -MD, -MMD
     361              :          or environment var dependency generation is used.  */
     362           28 :       cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM : DEPS_USER);
     363           28 :       flag_no_output = 1;
     364           28 :       break;
     365              : 
     366         5892 :     case OPT_MD:
     367         5892 :     case OPT_MMD:
     368         5892 :       cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM : DEPS_USER);
     369         5892 :       cpp_opts->deps.need_preprocessor_output = true;
     370         5892 :       deps_file = arg;
     371         5892 :       break;
     372              : 
     373           51 :     case OPT_fdeps_format_:
     374              :       /* https://wg21.link/p1689r5 */
     375           51 :       if (!strcmp (arg, "p1689r5"))
     376           48 :         cpp_opts->deps.fdeps_format = FDEPS_FMT_P1689R5;
     377              :       else
     378            3 :         error ("%<-fdeps-format=%> unknown format %qs", arg);
     379              :       break;
     380              : 
     381           63 :     case OPT_fdeps_file_:
     382           63 :       deps_seen = true;
     383           63 :       fdeps_file = arg;
     384           63 :       break;
     385              : 
     386           63 :     case OPT_fdeps_target_:
     387           63 :       deps_seen = true;
     388           63 :       defer_opt (code, arg);
     389           63 :       break;
     390              : 
     391         5836 :     case OPT_MF:
     392         5836 :       deps_seen = true;
     393         5836 :       deps_file = arg;
     394         5836 :       break;
     395              : 
     396            3 :     case OPT_MG:
     397            3 :       deps_seen = true;
     398            3 :       cpp_opts->deps.missing_files = true;
     399            3 :       break;
     400              : 
     401         5821 :     case OPT_MP:
     402         5821 :       deps_seen = true;
     403         5821 :       cpp_opts->deps.phony_targets = true;
     404         5821 :       break;
     405              : 
     406            0 :     case OPT_Mmodules:
     407              :       /* Do not set deps_seen, so the user can unconditionally turn
     408              :          this on or off.  */
     409            0 :       cpp_opts->deps.modules = true;
     410            0 :       break;
     411              : 
     412            3 :     case OPT_Mno_modules:
     413              :       /* Do not set deps_seen, so the user can unconditionally turn
     414              :          this on or off.  */
     415            3 :       cpp_opts->deps.modules = false;
     416            3 :       break;
     417              : 
     418         5888 :     case OPT_MQ:
     419         5888 :     case OPT_MT:
     420         5888 :       deps_seen = true;
     421         5888 :       defer_opt (code, arg);
     422         5888 :       break;
     423              : 
     424           43 :     case OPT_P:
     425           43 :       flag_no_line_commands = 1;
     426           43 :       break;
     427              : 
     428           60 :     case OPT_U:
     429           60 :       defer_opt (code, arg);
     430           60 :       break;
     431              : 
     432        10922 :     case OPT_Wall:
     433              :       /* ??? Don't add new options here. Use LangEnabledBy in c.opt.  */
     434              : 
     435        10922 :       cpp_opts->warn_num_sign_change = value;
     436        10922 :       break;
     437              : 
     438        11010 :     case OPT_Wunknown_pragmas:
     439              :       /* Set to greater than 1, so that even unknown pragmas in
     440              :          system headers will be warned about.  */
     441              :       /* ??? There is no way to handle this automatically for now.  */
     442        11010 :       warn_unknown_pragmas = value * 2;
     443        11010 :       break;
     444              : 
     445         3959 :     case OPT_ansi:
     446         3959 :       if (!c_dialect_cxx ())
     447         3813 :         set_std_c89 (false, true);
     448              :       else
     449          146 :         set_std_cxx98 (true);
     450              :       break;
     451              : 
     452         1661 :     case OPT_d:
     453         1661 :       handle_OPT_d (arg);
     454         1661 :       break;
     455              : 
     456        12651 :     case OPT_Wabi_:
     457        12651 :       warn_abi = true;
     458        12651 :       if (value == 1)
     459              :         {
     460            0 :           warning (0, "%<-Wabi=1%> is not supported, using =2");
     461            0 :           value = 2;
     462              :         }
     463        12651 :       warn_abi_version = value;
     464        12651 :       break;
     465              : 
     466           18 :     case OPT_fcanonical_system_headers:
     467           18 :       cpp_opts->canonical_system_headers = value;
     468           18 :       break;
     469              : 
     470           12 :     case OPT_fcond_mismatch:
     471           12 :       if (!c_dialect_cxx ())
     472              :         {
     473           12 :           flag_cond_mismatch = value;
     474           12 :           break;
     475              :         }
     476            0 :       warning (0, "switch %qs is no longer supported", option->opt_text);
     477            0 :       break;
     478              : 
     479          308 :     case OPT_fbuiltin_:
     480          308 :       if (value)
     481              :         result = false;
     482              :       else
     483          308 :         disable_builtin_function (arg);
     484              :       break;
     485              : 
     486         1102 :     case OPT_fdirectives_only:
     487         1102 :       cpp_opts->directives_only = value;
     488         1102 :       break;
     489              : 
     490            7 :     case OPT_fdollars_in_identifiers:
     491            7 :       cpp_opts->dollars_in_ident = value;
     492            7 :       break;
     493              : 
     494            8 :     case OPT_fmacro_prefix_map_:
     495            8 :       add_macro_prefix_map (arg);
     496            8 :       break;
     497              : 
     498          887 :     case OPT_ffreestanding:
     499          887 :       value = !value;
     500              :       /* Fall through.  */
     501          895 :     case OPT_fhosted:
     502          895 :       flag_hosted = value;
     503          895 :       flag_no_builtin = !value;
     504          895 :       break;
     505              : 
     506            0 :     case OPT_fconstant_string_class_:
     507            0 :       constant_string_class_name = arg;
     508            0 :       break;
     509              : 
     510            0 :     case OPT_fextended_identifiers:
     511            0 :       cpp_opts->extended_identifiers = value;
     512            0 :       break;
     513              : 
     514            4 :     case OPT_fmax_include_depth_:
     515            4 :         cpp_opts->max_include_depth = value;
     516            4 :       break;
     517              : 
     518            4 :     case OPT_foperator_names:
     519            4 :       cpp_opts->operator_names = value;
     520            4 :       break;
     521              : 
     522            0 :     case OPT_fpch_deps:
     523            0 :       cpp_opts->restore_pch_deps = value;
     524            0 :       break;
     525              : 
     526          475 :     case OPT_fpch_preprocess:
     527          475 :       flag_pch_preprocess = value;
     528          475 :       break;
     529              : 
     530         1151 :     case OPT_fpermissive:
     531         1151 :       flag_permissive = value;
     532         1151 :       global_dc->m_permissive = value;
     533         1151 :       break;
     534              : 
     535          527 :     case OPT_fpreprocessed:
     536          527 :       cpp_opts->preprocessed = value;
     537          527 :       break;
     538              : 
     539            2 :     case OPT_fdebug_cpp:
     540            2 :       cpp_opts->debug = value;
     541            2 :       break;
     542              : 
     543            1 :     case OPT_ftrack_macro_expansion:
     544            1 :       if (value)
     545            0 :         value = 2;
     546              :       /* Fall Through.  */
     547              : 
     548          483 :     case OPT_ftrack_macro_expansion_:
     549          483 :       if (arg && *arg != '\0')
     550          482 :         cpp_opts->track_macro_expansion = value;
     551              :       else
     552            1 :         cpp_opts->track_macro_expansion = 2;
     553              :       break;
     554              : 
     555          107 :     case OPT_fexec_charset_:
     556          107 :       cpp_opts->narrow_charset = arg;
     557          107 :       break;
     558              : 
     559            2 :     case OPT_fwide_exec_charset_:
     560            2 :       cpp_opts->wide_charset = arg;
     561            2 :       break;
     562              : 
     563           93 :     case OPT_finput_charset_:
     564           93 :       cpp_opts->input_charset = arg;
     565           93 :       cpp_opts->cpp_input_charset_explicit = 1;
     566           93 :       break;
     567              : 
     568           29 :     case OPT_ftemplate_depth_:
     569           29 :       max_tinst_depth = value;
     570           29 :       break;
     571              : 
     572           21 :     case OPT_fvisibility_inlines_hidden:
     573           21 :       visibility_options.inlines_hidden = value;
     574           21 :       break;
     575              : 
     576           22 :     case OPT_femit_struct_debug_baseonly:
     577           22 :       set_struct_debug_option (&global_options, loc, "base");
     578           22 :       break;
     579              : 
     580            8 :     case OPT_femit_struct_debug_reduced:
     581            8 :       set_struct_debug_option (&global_options, loc,
     582              :                                "dir:ord:sys,dir:gen:any,ind:base");
     583            8 :       break;
     584              : 
     585           12 :     case OPT_femit_struct_debug_detailed_:
     586           12 :       set_struct_debug_option (&global_options, loc, arg);
     587           12 :       break;
     588              : 
     589           17 :     case OPT_fext_numeric_literals:
     590           17 :       cpp_opts->ext_numeric_literals = value;
     591           17 :       break;
     592              : 
     593            4 :     case OPT_idirafter:
     594            4 :       add_path (xstrdup (arg), INC_AFTER, 0, true);
     595            4 :       break;
     596              : 
     597         9336 :     case OPT_imacros:
     598         9336 :     case OPT_include:
     599         9336 :       defer_opt (code, arg);
     600         9336 :       break;
     601              : 
     602         5370 :     case OPT_imultilib:
     603         5370 :       imultilib = arg;
     604         5370 :       break;
     605              : 
     606       205123 :     case OPT_iprefix:
     607       205123 :       iprefix = arg;
     608       205123 :       break;
     609              : 
     610         2918 :     case OPT_iquote:
     611         2918 :       add_path (xstrdup (arg), INC_QUOTE, 0, true);
     612         2918 :       break;
     613              : 
     614            0 :     case OPT_isysroot:
     615            0 :       sysroot = arg;
     616            0 :       break;
     617              : 
     618       460914 :     case OPT_isystem:
     619       460914 :       add_path (xstrdup (arg), INC_SYSTEM, 0, true);
     620       460914 :       break;
     621              : 
     622            0 :     case OPT_iwithprefix:
     623            0 :       add_prefixed_path (arg, INC_SYSTEM);
     624            0 :       break;
     625              : 
     626            0 :     case OPT_iwithprefixbefore:
     627            0 :       add_prefixed_path (arg, INC_BRACKET);
     628            0 :       break;
     629              : 
     630           84 :     case OPT__embed_dir_:
     631           84 :       add_path (xstrdup (arg), INC_EMBED, 0, true);
     632           84 :       break;
     633              : 
     634          981 :     case OPT_lang_asm:
     635          981 :       cpp_set_lang (parse_in, CLK_ASM);
     636          981 :       cpp_opts->dollars_in_ident = false;
     637          981 :       break;
     638              : 
     639           60 :     case OPT_nostdinc:
     640           60 :       std_inc = false;
     641           60 :       break;
     642              : 
     643       109446 :     case OPT_nostdinc__:
     644       109446 :       std_cxx_inc = false;
     645       109446 :       break;
     646              : 
     647       207713 :     case OPT_o:
     648       207713 :       if (!out_fname)
     649       207713 :         out_fname = arg;
     650              :       else
     651            0 :         error ("output filename specified twice");
     652              :       break;
     653              : 
     654            0 :     case OPT_print_objc_runtime_info:
     655            0 :       print_struct_values = 1;
     656            0 :       break;
     657              : 
     658            2 :     case OPT_remap:
     659            2 :       cpp_opts->remap = 1;
     660            2 :       break;
     661              : 
     662        14100 :     case OPT_std_c__98:
     663        14100 :     case OPT_std_gnu__98:
     664        14100 :       if (!preprocessing_asm_p)
     665        14100 :         set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
     666              :       break;
     667              : 
     668         5645 :     case OPT_std_c__11:
     669         5645 :     case OPT_std_gnu__11:
     670         5645 :       if (!preprocessing_asm_p)
     671         5645 :         set_std_cxx11 (code == OPT_std_c__11 /* ISO */);
     672              :       break;
     673              : 
     674         1286 :     case OPT_std_c__14:
     675         1286 :     case OPT_std_gnu__14:
     676         1286 :       if (!preprocessing_asm_p)
     677         1286 :         set_std_cxx14 (code == OPT_std_c__14 /* ISO */);
     678              :       break;
     679              : 
     680         4141 :     case OPT_std_c__17:
     681         4141 :     case OPT_std_gnu__17:
     682         4141 :       if (!preprocessing_asm_p)
     683         4141 :         set_std_cxx17 (code == OPT_std_c__17 /* ISO */);
     684              :       break;
     685              : 
     686        31908 :     case OPT_std_c__20:
     687        31908 :     case OPT_std_gnu__20:
     688        31908 :       if (!preprocessing_asm_p)
     689        31908 :         set_std_cxx20 (code == OPT_std_c__20 /* ISO */);
     690              :       break;
     691              : 
     692         2055 :     case OPT_std_c__23:
     693         2055 :     case OPT_std_gnu__23:
     694         2055 :       if (!preprocessing_asm_p)
     695         2055 :         set_std_cxx23 (code == OPT_std_c__23 /* ISO */);
     696              :       break;
     697              : 
     698        23530 :     case OPT_std_c__26:
     699        23530 :     case OPT_std_gnu__26:
     700        23530 :       if (!preprocessing_asm_p)
     701        23530 :         set_std_cxx26 (code == OPT_std_c__26 /* ISO */);
     702              :       break;
     703              : 
     704          191 :     case OPT_std_c90:
     705          191 :     case OPT_std_iso9899_199409:
     706          191 :       if (!preprocessing_asm_p)
     707          191 :         set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
     708              :       break;
     709              : 
     710         2953 :     case OPT_std_gnu90:
     711         2953 :       if (!preprocessing_asm_p)
     712         2953 :         set_std_c89 (false /* c94 */, false /* ISO */);
     713              :       break;
     714              : 
     715          575 :     case OPT_std_c99:
     716          575 :       if (!preprocessing_asm_p)
     717          574 :         set_std_c99 (true /* ISO */);
     718              :       break;
     719              : 
     720          614 :     case OPT_std_gnu99:
     721          614 :       if (!preprocessing_asm_p)
     722          614 :         set_std_c99 (false /* ISO */);
     723              :       break;
     724              : 
     725          514 :     case OPT_std_c11:
     726          514 :       if (!preprocessing_asm_p)
     727          514 :         set_std_c11 (true /* ISO */);
     728              :       break;
     729              : 
     730         3712 :     case OPT_std_gnu11:
     731         3712 :       if (!preprocessing_asm_p)
     732         3712 :         set_std_c11 (false /* ISO */);
     733              :       break;
     734              : 
     735           42 :     case OPT_std_c17:
     736           42 :       if (!preprocessing_asm_p)
     737           42 :         set_std_c17 (true /* ISO */);
     738              :       break;
     739              : 
     740          784 :     case OPT_std_gnu17:
     741          784 :       if (!preprocessing_asm_p)
     742          784 :         set_std_c17 (false /* ISO */);
     743              :       break;
     744              : 
     745          868 :     case OPT_std_c23:
     746          868 :       if (!preprocessing_asm_p)
     747          868 :         set_std_c23 (true /* ISO */);
     748              :       break;
     749              : 
     750          202 :     case OPT_std_gnu23:
     751          202 :       if (!preprocessing_asm_p)
     752          202 :         set_std_c23 (false /* ISO */);
     753              :       break;
     754              : 
     755          177 :     case OPT_std_c2y:
     756          177 :       if (!preprocessing_asm_p)
     757          177 :         set_std_c2y (true /* ISO */);
     758              :       break;
     759              : 
     760           11 :     case OPT_std_gnu2y:
     761           11 :       if (!preprocessing_asm_p)
     762           11 :         set_std_c2y (false /* ISO */);
     763              :       break;
     764              : 
     765           20 :     case OPT_trigraphs:
     766           20 :       cpp_opts->trigraphs = 1;
     767           20 :       break;
     768              : 
     769         2927 :     case OPT_traditional_cpp:
     770         2927 :       cpp_opts->traditional = 1;
     771         2927 :       break;
     772              : 
     773            0 :     case OPT_fsearch_include_path:
     774            0 :       cpp_opts->main_search = CMS_user;
     775            0 :       break;
     776              : 
     777            2 :     case OPT_fsearch_include_path_:
     778            2 :       if (!strcmp (arg, "user"))
     779            0 :         cpp_opts->main_search = CMS_user;
     780            2 :       else if (!strcmp (arg, "system"))
     781            2 :         cpp_opts->main_search = CMS_system;
     782              :       else
     783            0 :         error ("invalid argument %qs to %<-fsearch-include-path%>", arg);
     784              :       break;
     785              : 
     786          113 :     case OPT_v:
     787          113 :       verbose = true;
     788          113 :       break;
     789              :     }
     790              : 
     791      3333615 :   switch (c_language)
     792              :     {
     793      1430964 :     case clk_c:
     794      1430964 :       C_handle_option_auto (&global_options, &global_options_set,
     795              :                             scode, arg, value,
     796              :                             c_family_lang_mask, kind,
     797              :                             loc, handlers, global_dc);
     798      1430964 :       break;
     799              : 
     800            0 :     case clk_objc:
     801            0 :       ObjC_handle_option_auto (&global_options, &global_options_set,
     802              :                                scode, arg, value,
     803              :                                c_family_lang_mask, kind,
     804              :                                loc, handlers, global_dc);
     805            0 :       break;
     806              : 
     807      1902651 :     case clk_cxx:
     808      1902651 :       CXX_handle_option_auto (&global_options, &global_options_set,
     809              :                               scode, arg, value,
     810              :                               c_family_lang_mask, kind,
     811              :                               loc, handlers, global_dc);
     812      1902651 :       break;
     813              : 
     814            0 :     case clk_objcxx:
     815            0 :       ObjCXX_handle_option_auto (&global_options, &global_options_set,
     816              :                                  scode, arg, value,
     817              :                                  c_family_lang_mask, kind,
     818              :                                  loc, handlers, global_dc);
     819            0 :       break;
     820              : 
     821            0 :     default:
     822            0 :       gcc_unreachable ();
     823              :     }
     824              : 
     825      3333615 :   cpp_handle_option_auto (&global_options, scode, cpp_opts);
     826      3333615 :   return result;
     827              : }
     828              : 
     829              : /* Default implementation of TARGET_HANDLE_C_OPTION.  */
     830              : 
     831              : bool
     832            0 : default_handle_c_option (size_t code ATTRIBUTE_UNUSED,
     833              :                          const char *arg ATTRIBUTE_UNUSED,
     834              :                          int value ATTRIBUTE_UNUSED)
     835              : {
     836            0 :   return false;
     837              : }
     838              : 
     839              : /* Post-switch processing.  */
     840              : bool
     841       208380 : c_common_post_options (const char **pfilename)
     842              : {
     843              :   /* Canonicalize the input and output filenames.  */
     844       208380 :   if (in_fnames == NULL)
     845              :     {
     846            0 :       in_fnames = XNEWVEC (const char *, 1);
     847            0 :       in_fnames[0] = "";
     848              :     }
     849       208380 :   else if (strcmp (in_fnames[0], "-") == 0)
     850              :     {
     851          407 :       if (pch_file)
     852            0 :         error ("cannot use %<-%> as input filename for a precompiled header");
     853              : 
     854          407 :       in_fnames[0] = "";
     855              :     }
     856              : 
     857       208380 :   if (out_fname == NULL || !strcmp (out_fname, "-"))
     858          745 :     out_fname = "";
     859              : 
     860       208380 :   if (cpp_opts->deps.style == DEPS_NONE)
     861       202460 :     check_deps_environment_vars ();
     862              : 
     863       208380 :   handle_deferred_opts ();
     864              : 
     865       208380 :   sanitize_cpp_opts ();
     866              : 
     867              :   /* Don't register include chains if under -fpreprocessed since we might not
     868              :      have correct sysroot this mode, and this may cause file permssion
     869              :      issue.  */
     870       208380 :   if (!cpp_opts->preprocessed)
     871       207853 :     register_include_chains (parse_in, sysroot, iprefix, imultilib,
     872       207853 :                              std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
     873              : 
     874              : #ifdef C_COMMON_OVERRIDE_OPTIONS
     875              :   /* Some machines may reject certain combinations of C
     876              :      language-specific options.  */
     877              :   C_COMMON_OVERRIDE_OPTIONS;
     878              : #endif
     879              : 
     880       208380 :   if (flag_excess_precision == EXCESS_PRECISION_DEFAULT)
     881       355500 :     flag_excess_precision = (flag_iso ? EXCESS_PRECISION_STANDARD
     882              :                              : EXCESS_PRECISION_FAST);
     883              : 
     884              :   /* ISO C restricts floating-point expression contraction to within
     885              :      source-language expressions (-ffp-contract=on, currently an alias
     886              :      for -ffp-contract=off).  */
     887       208380 :   if (flag_iso
     888        58082 :       && !c_dialect_cxx ()
     889         6168 :       && (OPTION_SET_P (flag_fp_contract_mode)
     890              :           == (enum fp_contract_mode) 0)
     891         6168 :       && flag_unsafe_math_optimizations == 0)
     892         6163 :     flag_fp_contract_mode = FP_CONTRACT_OFF;
     893              : 
     894              :   /* C language modes before C99 enable -fpermissive by default, but
     895              :      only if -pedantic-errors is not specified.  Also treat
     896              :      -fno-permissive as a subset of -pedantic-errors that does not
     897              :      reject certain GNU extensions also present the defaults for later
     898              :      language modes.  */
     899       208380 :   if (!c_dialect_cxx ()
     900       110893 :       && !flag_isoc99
     901         6946 :       && !global_dc->m_pedantic_errors
     902         5938 :       && !OPTION_SET_P (flag_permissive))
     903              :     {
     904         5937 :       flag_permissive = 1;
     905         5937 :       global_dc->m_permissive = 1;
     906              :     }
     907              : 
     908              :   /* If we are compiling C, and we are outside of a standards mode,
     909              :      we can permit the new values from ISO/IEC TS 18661-3 for
     910              :      FLT_EVAL_METHOD.  Otherwise, we must restrict the possible values to
     911              :      the set specified in ISO C99/C11.  */
     912       208380 :   if (!flag_iso
     913       150298 :       && !c_dialect_cxx ()
     914       104725 :       && (OPTION_SET_P (flag_permitted_flt_eval_methods)
     915              :           == PERMITTED_FLT_EVAL_METHODS_DEFAULT))
     916       104724 :     flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_TS_18661;
     917              :   else
     918       103656 :     flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_C11;
     919              : 
     920       208380 :   if (cxx_dialect >= cxx26)
     921        23484 :     SET_OPTION_IF_UNSET (&global_options, &global_options_set,
     922              :                          flag_auto_var_init, AUTO_INIT_CXX26);
     923              : 
     924              :   /* The -Wtrivial-auto-var-init warning is useless for C++, where we always
     925              :      add .DEFERRED_INIT calls when some (vacuous) initializers are bypassed
     926              :      through jumps from switch condition to case/default label.  */
     927       208380 :   if (c_dialect_cxx ())
     928        97487 :     warn_trivial_auto_var_init = 0;
     929              : 
     930              :   /* C23 Annex F does not permit certain built-in functions to raise
     931              :      "inexact".  */
     932       208380 :   if (flag_isoc23)
     933        97707 :     SET_OPTION_IF_UNSET (&global_options, &global_options_set,
     934              :                          flag_fp_int_builtin_inexact, 0);
     935              : 
     936              :   /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
     937              :      inline semantics are not supported in GNU89 or C89 mode.  */
     938       208380 :   if (flag_gnu89_inline == -1)
     939       207937 :     flag_gnu89_inline = !flag_isoc99;
     940          443 :   else if (!flag_gnu89_inline && !flag_isoc99)
     941            1 :     error ("%<-fno-gnu89-inline%> is only supported in GNU99 or C99 mode");
     942              : 
     943              :   /* Default to ObjC sjlj exception handling if NeXT runtime < v2.  */
     944       208380 :   if (flag_objc_sjlj_exceptions < 0)
     945       416760 :     flag_objc_sjlj_exceptions = (flag_next_runtime && flag_objc_abi < 2);
     946       208380 :   if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
     947            0 :     flag_exceptions = 1;
     948              : 
     949              :   /* If -ffreestanding, -fno-hosted or -fno-builtin then disable
     950              :      pattern recognition.  */
     951       208380 :   if (flag_no_builtin)
     952          770 :     SET_OPTION_IF_UNSET (&global_options, &global_options_set,
     953              :                          flag_tree_loop_distribute_patterns, 0);
     954              : 
     955              :   /* -Woverlength-strings is off by default, but is enabled by -Wpedantic.
     956              :      It is never enabled in C++, as the minimum limit is not normative
     957              :      in that standard.  */
     958       208380 :   if (c_dialect_cxx ())
     959        97487 :     warn_overlength_strings = 0;
     960              : 
     961              :   /* Wmain is enabled by default in C++ but not in C.  */
     962              :   /* Wmain is disabled by default for -ffreestanding (!flag_hosted),
     963              :      even if -Wall or -Wpedantic was given (warn_main will be 2 if set
     964              :      by -Wall, 1 if set by -Wmain).  */
     965       208380 :   if (warn_main == -1)
     966       251356 :     warn_main = (c_dialect_cxx () && flag_hosted) ? 1 : 0;
     967        56689 :   else if (warn_main == 2)
     968        56368 :     warn_main = flag_hosted ? 1 : 0;
     969              : 
     970              :   /* In C, -Wall and -Wc++-compat enable -Wenum-compare; if it has not
     971              :      yet been set, it is disabled by default.  In C++, it is enabled
     972              :      by default.  */
     973       208380 :   if (warn_enum_compare == -1)
     974       198875 :     warn_enum_compare = c_dialect_cxx () ? 1 : 0;
     975              : 
     976              :   /* For C++26 default to -Wkeyword-macro if -Wpedantic.  */
     977       208380 :   if (cxx_dialect >= cxx26 && pedantic)
     978              :     {
     979        14756 :       SET_OPTION_IF_UNSET (&global_options, &global_options_set,
     980              :                            warn_keyword_macro, 1);
     981        14756 :       if (warn_keyword_macro)
     982        14755 :         cpp_opts->cpp_warn_keyword_macro = warn_keyword_macro;
     983              :     }
     984              : 
     985              :   /* -Wpacked-bitfield-compat is on by default for the C languages.  The
     986              :      warning is issued in stor-layout.cc which is not part of the front-end so
     987              :      we need to selectively turn it on here.  */
     988       208380 :   if (warn_packed_bitfield_compat == -1)
     989       208372 :     warn_packed_bitfield_compat = 1;
     990              : 
     991              :   /* Special format checking options don't work without -Wformat; warn if
     992              :      they are used.  */
     993       208380 :   if (!warn_format)
     994              :     {
     995       197111 :       warning (OPT_Wformat_y2k,
     996              :                "%<-Wformat-y2k%> ignored without %<-Wformat%>");
     997       197111 :       warning (OPT_Wformat_extra_args,
     998              :                "%<-Wformat-extra-args%> ignored without %<-Wformat%>");
     999       197111 :       warning (OPT_Wformat_zero_length,
    1000              :                "%<-Wformat-zero-length%> ignored without %<-Wformat%>");
    1001       197111 :       warning (OPT_Wformat_nonliteral,
    1002              :                "%<-Wformat-nonliteral%> ignored without %<-Wformat%>");
    1003       197111 :       warning (OPT_Wformat_contains_nul,
    1004              :                "%<-Wformat-contains-nul%> ignored without %<-Wformat%>");
    1005       197111 :       warning (OPT_Wformat_security,
    1006              :                "%<-Wformat-security%> ignored without %<-Wformat%>");
    1007              :     }
    1008              : 
    1009              :   /* -Wimplicit-function-declaration is enabled by default for C99.  */
    1010       208380 :   if (warn_implicit_function_declaration == -1)
    1011       200028 :     warn_implicit_function_declaration = flag_isoc99;
    1012              : 
    1013              :   /* -Wimplicit-int is enabled by default for C99.  */
    1014       208380 :   if (warn_implicit_int == -1)
    1015       200085 :     warn_implicit_int = flag_isoc99;
    1016              : 
    1017              :   /* -Wold-style-definition is enabled by default for C23.  */
    1018       208380 :   if (warn_old_style_definition == -1)
    1019       204083 :     warn_old_style_definition = flag_isoc23;
    1020              : 
    1021              :   /* -Wshift-overflow is enabled by default in C99 and C++11 modes.  */
    1022       208380 :   if (warn_shift_overflow == -1)
    1023       395535 :     warn_shift_overflow = cxx_dialect >= cxx11 || flag_isoc99;
    1024              : 
    1025              :   /* -Wmissing-parameter-name is enabled by -pedantic before C23,
    1026              :      and for -Wc11-c23-compat.  */
    1027       208380 :   if (warn_missing_parameter_name == -1)
    1028       208377 :     warn_missing_parameter_name
    1029        48108 :       = ((pedantic && !flag_isoc23 && warn_c11_c23_compat != 0)
    1030       256530 :          || warn_c11_c23_compat > 0);
    1031              : 
    1032              :   /* Likewise for -Wfree-labels.  */
    1033       208380 :   if (warn_free_labels == -1)
    1034        48108 :     warn_free_labels = ((pedantic && !flag_isoc23 && warn_c11_c23_compat != 0)
    1035       256530 :                         || warn_c11_c23_compat > 0);
    1036              : 
    1037       208380 :   if (warn_deprecated_non_prototype == -1)
    1038       208375 :     warn_deprecated_non_prototype = warn_c11_c23_compat > 0;
    1039              : 
    1040              :   /* -Wshift-negative-value is enabled by -Wextra in C99 and C++11 to C++17
    1041              :      modes.  */
    1042       208380 :   if (warn_shift_negative_value == -1)
    1043       416720 :     warn_shift_negative_value = (extra_warnings
    1044         7775 :                                  && (cxx_dialect >= cxx11 || flag_isoc99)
    1045       417073 :                                  && cxx_dialect < cxx20);
    1046              : 
    1047              :   /* -Wregister is enabled by default in C++17.  */
    1048       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set, warn_register,
    1049              :                        cxx_dialect >= cxx17);
    1050              : 
    1051              :   /* Explicit -Wdeprecated turns on warnings from later standards.  */
    1052      1630480 :   auto deprecated_in = [&](enum cxx_dialect d)
    1053              :   {
    1054      1422100 :     if (OPTION_SET_P (warn_deprecated)) return !!warn_deprecated;
    1055      1420612 :     return (warn_deprecated && cxx_dialect >= d);
    1056              :   };
    1057              : 
    1058              :   /* -Wcomma-subscript is enabled by default in C++20.  */
    1059       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1060              :                        warn_comma_subscript,
    1061              :                        cxx_dialect >= cxx23
    1062              :                        || deprecated_in (cxx20));
    1063              : 
    1064              :   /* -Wvolatile is enabled by default in C++20.  */
    1065       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set, warn_volatile,
    1066              :                        deprecated_in (cxx20));
    1067              : 
    1068              :   /* -Wdeprecated-enum-enum-conversion is enabled by default in C++20.  */
    1069       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1070              :                        warn_deprecated_enum_enum_conv,
    1071              :                        deprecated_in (cxx20));
    1072              : 
    1073              :   /* -Wdeprecated-enum-float-conversion is enabled by default in C++20.  */
    1074       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1075              :                        warn_deprecated_enum_float_conv,
    1076              :                        deprecated_in (cxx20));
    1077              : 
    1078              :   /* -Wdeprecated-literal-operator is enabled by default in C++23.  */
    1079       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1080              :                        warn_deprecated_literal_operator,
    1081              :                        deprecated_in (cxx23));
    1082              : 
    1083              :   /* -Warray-compare is enabled by default in C++20.  */
    1084       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1085              :                        warn_array_compare,
    1086              :                        warn_array_compare || deprecated_in (cxx20));
    1087              : 
    1088              :   /* -Wdeprecated-variadic-comma-omission is enabled by default in C++26.  */
    1089       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1090              :                        warn_deprecated_variadic_comma_omission,
    1091              :                        deprecated_in (cxx26));
    1092              : 
    1093              :   /* -Wtemplate-id-cdtor is enabled by default in C++20.  */
    1094       282079 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1095              :                        warn_template_id_cdtor,
    1096              :                        cxx_dialect >= cxx20 || warn_cxx20_compat);
    1097              : 
    1098              :   /* Declone C++ 'structors if -Os.  */
    1099       208380 :   if (flag_declone_ctor_dtor == -1)
    1100       208343 :     flag_declone_ctor_dtor = optimize_size;
    1101              : 
    1102       208380 :   if (flag_abi_compat_version == 1)
    1103              :     {
    1104            0 :       warning (0, "%<-fabi-compat-version=1%> is not supported, using =2");
    1105            0 :       flag_abi_compat_version = 2;
    1106              :     }
    1107              : 
    1108              :   /* Change flag_abi_version to be the actual current ABI level, for the
    1109              :      benefit of c_cpp_builtins, and to make comparison simpler.  */
    1110       208380 :   const int latest_abi_version = 21;
    1111              :   /* Possibly different for non-default ABI fixes within a release.  */
    1112       208380 :   const int default_abi_version = latest_abi_version;
    1113              :   /* Generate compatibility aliases for ABI v18 (GCC 13) by default.  */
    1114       208380 :   const int abi_compat_default = 18;
    1115              : 
    1116       208380 :   if (flag_abi_version > latest_abi_version)
    1117            0 :     warning (0, "%<-fabi-version=%d%> is not supported, using =%d",
    1118              :              flag_abi_version, latest_abi_version);
    1119              : 
    1120       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1121              :                        flag_abi_version, default_abi_version);
    1122              : 
    1123              : #define clamp(X) if (X == 0 || X > latest_abi_version) X = latest_abi_version
    1124       208380 :   clamp (flag_abi_version);
    1125              :   /* Don't clamp warn_abi_version, let it be 0 or out of bounds.  */
    1126       208380 :   clamp (flag_abi_compat_version);
    1127              : #undef clamp
    1128              : 
    1129              :   /* Default -Wabi= or -fabi-compat-version= from each other.  */
    1130       208380 :   if (warn_abi_version == -1 && flag_abi_compat_version != -1)
    1131          197 :     warn_abi_version = flag_abi_compat_version;
    1132       208183 :   else if (flag_abi_compat_version == -1 && warn_abi_version != -1)
    1133        12604 :     flag_abi_compat_version = warn_abi_version;
    1134       195579 :   else if (warn_abi_version == -1 && flag_abi_compat_version == -1)
    1135              :     {
    1136       195534 :       warn_abi_version = 0;
    1137       195534 :       if (flag_abi_version == default_abi_version)
    1138       195299 :         flag_abi_compat_version = abi_compat_default;
    1139              :       else
    1140          235 :         flag_abi_compat_version = latest_abi_version;
    1141              :     }
    1142              : 
    1143              :   /* Allow warnings vs ABI versions beyond what we currently support.  */
    1144       208380 :   if (warn_abi_version == 0)
    1145       195549 :     warn_abi_version = 1000;
    1146              : 
    1147              :   /* By default, enable the new inheriting constructor semantics along with ABI
    1148              :      11.  New and old should coexist fine, but it is a change in what
    1149              :      artificial symbols are generated.  */
    1150       416504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1151              :                        flag_new_inheriting_ctors,
    1152              :                        abi_version_at_least (11));
    1153              : 
    1154              :   /* For GCC 7, only enable DR150 resolution by default if -std=c++17.  */
    1155       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set, flag_new_ttp,
    1156              :                        cxx_dialect >= cxx17);
    1157              : 
    1158              :   /* C++11 guarantees forward progress.  */
    1159       391091 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set, flag_finite_loops,
    1160              :                        optimize >= 2 && cxx_dialect >= cxx11);
    1161              : 
    1162              :   /* It's OK to discard calls to pure/const functions that might throw.  */
    1163       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1164              :                        flag_delete_dead_exceptions, true);
    1165              : 
    1166       208380 :   if (cxx_dialect >= cxx11)
    1167              :     {
    1168              :       /* If we're allowing C++0x constructs, don't warn about C++98
    1169              :          identifiers which are keywords in C++0x.  */
    1170        83311 :       warn_cxx11_compat = 0;
    1171        83311 :       cpp_opts->cpp_warn_cxx11_compat = 0;
    1172              : 
    1173        83311 :       if (warn_narrowing == -1)
    1174        81122 :         warn_narrowing = 1;
    1175              : 
    1176              :       /* Unless -f{,no-}ext-numeric-literals has been used explicitly,
    1177              :          for -std=c++{11,14,17,20,23,26} default to
    1178              :          -fno-ext-numeric-literals.  */
    1179        83311 :       if (flag_iso && !OPTION_SET_P (flag_ext_numeric_literals))
    1180        43045 :         cpp_opts->ext_numeric_literals = 0;
    1181              :     }
    1182       125069 :   else if (warn_narrowing == -1)
    1183       124576 :     warn_narrowing = 0;
    1184              : 
    1185       208380 :   if (cxx_dialect >= cxx20)
    1186              :     {
    1187              :       /* Don't warn about C++20 compatibility changes in C++20 or later.  */
    1188        72277 :       warn_cxx20_compat = 0;
    1189        72277 :       cpp_opts->cpp_warn_cxx20_compat = 0;
    1190              :     }
    1191       208380 :   if (cxx_dialect >= cxx26)
    1192              :     /* Don't warn about C++26 compatibility changes in C++26 or later.  */
    1193        23484 :     warn_cxx26_compat = 0;
    1194              : 
    1195              :   /* C++17 has stricter evaluation order requirements; let's use some of them
    1196              :      for earlier C++ as well, so chaining works as expected.  */
    1197       208380 :   if (c_dialect_cxx ()
    1198        97487 :       && flag_strong_eval_order == -1)
    1199       118545 :     flag_strong_eval_order = (cxx_dialect >= cxx17 ? 2 : 1);
    1200              : 
    1201       208380 :   if (flag_implicit_constexpr && cxx_dialect < cxx14)
    1202            0 :     flag_implicit_constexpr = false;
    1203              : 
    1204              :   /* Global sized deallocation is new in C++14.  */
    1205       208380 :   if (flag_sized_deallocation == -1)
    1206       208376 :     flag_sized_deallocation = (cxx_dialect >= cxx14);
    1207              : 
    1208              :   /* Pedwarn about invalid constexpr functions before C++23.  */
    1209       208380 :   if (warn_invalid_constexpr == -1)
    1210       208364 :     warn_invalid_constexpr = (cxx_dialect < cxx23);
    1211              : 
    1212              :   /* char8_t support is implicitly enabled in C++20 and C23.  */
    1213       208380 :   if (flag_char8_t == -1)
    1214       378199 :     flag_char8_t = (cxx_dialect >= cxx20) || flag_isoc23;
    1215       208380 :   cpp_opts->unsigned_utf8char = flag_char8_t ? 1 : cpp_opts->unsigned_char;
    1216              : 
    1217       208380 :   cpp_opts->cpp_tabstop = global_dc->get_column_options ().m_tabstop;
    1218              : 
    1219       208380 :   if (flag_extern_tls_init)
    1220              :     {
    1221       208378 :       if (!TARGET_SUPPORTS_ALIASES || !SUPPORTS_WEAK)
    1222              :         {
    1223              :           /* Lazy TLS initialization for a variable in another TU requires
    1224              :              alias and weak reference support.  */
    1225              :           if (flag_extern_tls_init > 0)
    1226              :             sorry ("external TLS initialization functions not supported "
    1227              :                    "on this target");
    1228              : 
    1229              :           flag_extern_tls_init = 0;
    1230              :         }
    1231              :       else
    1232       208378 :         flag_extern_tls_init = 1;
    1233              :     }
    1234              : 
    1235              :   /* Enable by default only for C++ and C++ with ObjC extensions.  */
    1236       208380 :   if (warn_return_type == -1 && c_dialect_cxx ())
    1237        93946 :     warn_return_type = 1;
    1238              : 
    1239              :   /* C++20 is the final version of concepts.  We still use -fconcepts
    1240              :      to know when concepts are enabled.  */
    1241       208380 :   if (cxx_dialect >= cxx20)
    1242        72277 :     flag_concepts = 1;
    1243              : 
    1244              :   /* Coroutines are also a C++20 feature.  */
    1245       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1246              :                        flag_coroutines, cxx_dialect >= cxx20);
    1247              : 
    1248              :   /* Enable lifetime extension of range based for temporaries for C++23.  */
    1249       208380 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1250              :                        flag_range_for_ext_temps, cxx_dialect >= cxx23);
    1251              : 
    1252              :   /* EnabledBy unfortunately can't specify value to use if set and
    1253              :      LangEnabledBy can't specify multiple options with &&.  For -Wunused
    1254              :      or -Wunused -Wextra we want these to default to 3 unless user specified
    1255              :      some other level explicitly.  */
    1256       208380 :   if (warn_unused_but_set_parameter == 1)
    1257         7619 :     SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1258              :                          warn_unused_but_set_parameter, 3);
    1259       208380 :   if (warn_unused_but_set_variable == 1)
    1260        10468 :     SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1261              :                          warn_unused_but_set_variable, 3);
    1262              : 
    1263              :   /* -fimmediate-escalation has no effect when immediate functions are not
    1264              :      supported.  */
    1265       208380 :   if (flag_immediate_escalation && cxx_dialect < cxx20)
    1266       136103 :     flag_immediate_escalation = 0;
    1267              : 
    1268       208380 :   if (num_in_fnames > 1)
    1269            0 :     error ("too many filenames given; type %<%s %s%> for usage",
    1270              :            progname, "--help");
    1271              : 
    1272       208380 :   if (flag_preprocess_only)
    1273              :     {
    1274              :       /* Open the output now.  We must do so even if flag_no_output is
    1275              :          on, because there may be other output than from the actual
    1276              :          preprocessing (e.g. from -dM).  */
    1277         6772 :       if (out_fname[0] == '\0')
    1278          745 :         out_stream = stdout;
    1279              :       else
    1280         6027 :         out_stream = fopen (out_fname, "w");
    1281              : 
    1282         6772 :       if (out_stream == NULL)
    1283            0 :         fatal_error (input_location, "opening output file %s: %m", out_fname);
    1284              : 
    1285         6772 :       init_pp_output (out_stream);
    1286              :     }
    1287              :   else
    1288              :     {
    1289       201608 :       init_c_lex ();
    1290              : 
    1291              :       /* When writing a PCH file, avoid reading some other PCH file,
    1292              :          because the default address space slot then can't be used
    1293              :          for the output PCH file.  */
    1294       201608 :       if (pch_file)
    1295              :         {
    1296          428 :           c_common_no_more_pch ();
    1297              :           /* Only -g0 and -gdwarf* are supported with PCH, for other
    1298              :              debug formats we warn here and refuse to load any PCH files.  */
    1299          428 :           if (write_symbols != NO_DEBUG && write_symbols != DWARF2_DEBUG)
    1300            0 :               warning (OPT_Wdeprecated,
    1301              :                        "the %qs debug info cannot be used with "
    1302              :                        "pre-compiled headers",
    1303              :                        debug_set_names (write_symbols & ~DWARF2_DEBUG));
    1304              :           /* Let libcpp know that the main file is a header so it won't
    1305              :              complain about things like #include_next and #pragma once.  */
    1306          428 :           cpp_opts->main_search = CMS_header;
    1307              :         }
    1308       201180 :       else if (write_symbols != NO_DEBUG && write_symbols != DWARF2_DEBUG)
    1309          332 :         c_common_no_more_pch ();
    1310              : 
    1311              :       /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
    1312       201608 :       input_location = UNKNOWN_LOCATION;
    1313              :     }
    1314              : 
    1315       208380 :   struct cpp_callbacks *cb = cpp_get_callbacks (parse_in);
    1316       208380 :   cb->file_change = cb_file_change;
    1317       208380 :   cb->dir_change = cb_dir_change;
    1318       208380 :   if (lang_hooks.preprocess_options)
    1319        97487 :     lang_hooks.preprocess_options (parse_in);
    1320       208380 :   cpp_post_options (parse_in);
    1321       208380 :   init_global_opts_from_cpp (&global_options, cpp_get_options (parse_in));
    1322              :   /* For C++23 and explicit -finput-charset=UTF-8, turn on -Winvalid-utf8
    1323              :      by default and make it a pedwarn unless -Wno-invalid-utf8.  */
    1324       208380 :   if (cxx_dialect >= cxx23
    1325        25536 :       && cpp_opts->cpp_input_charset_explicit
    1326           23 :       && strcmp (cpp_opts->input_charset, "UTF-8") == 0
    1327           21 :       && (cpp_opts->cpp_warn_invalid_utf8
    1328           16 :           || !global_options_set.x_warn_invalid_utf8))
    1329              :     {
    1330           18 :       global_options.x_warn_invalid_utf8 = 1;
    1331           28 :       cpp_opts->cpp_warn_invalid_utf8 = cpp_opts->cpp_pedantic ? 2 : 1;
    1332              :     }
    1333              : 
    1334              :   /* Let diagnostics infrastructure know how to convert input files the same
    1335              :      way libcpp will do it, namely using the configured input charset and
    1336              :      skipping a UTF-8 BOM if present.  */
    1337       208380 :   diagnostic_initialize_input_context (global_dc,
    1338              :                                        c_common_input_charset_cb, true);
    1339       208380 :   input_location = UNKNOWN_LOCATION;
    1340              : 
    1341       416760 :   *pfilename = this_input_filename
    1342       416760 :     = cpp_read_main_file (parse_in, in_fnames[0],
    1343              :                           /* We'll inject preamble pieces if this is
    1344              :                              not preprocessed.  */
    1345       208380 :                           !cpp_opts->preprocessed);
    1346              : 
    1347              :   /* Don't do any compilation or preprocessing if there is no input file.  */
    1348       208380 :   if (this_input_filename == NULL)
    1349              :     {
    1350            0 :       errorcount++;
    1351            0 :       return false;
    1352              :     }
    1353              : 
    1354       208380 :   if (flag_working_directory
    1355        41762 :       && flag_preprocess_only && !flag_no_line_commands)
    1356         2245 :     pp_dir_change (parse_in, get_src_pwd ());
    1357              : 
    1358              :   /* Disable LTO output when outputting a precompiled header.  */
    1359       208380 :   if (pch_file && flag_lto)
    1360              :     {
    1361            0 :       flag_lto = 0;
    1362            0 :       flag_generate_lto = 0;
    1363              :     }
    1364              : 
    1365       208380 :   return flag_preprocess_only;
    1366              : }
    1367              : 
    1368              : /* Front end initialization common to C, ObjC and C++.  */
    1369              : bool
    1370       208165 : c_common_init (void)
    1371              : {
    1372              :   /* Set up preprocessor arithmetic.  Must be done after call to
    1373              :      c_common_nodes_and_builtins for type nodes to be good.  */
    1374       208165 :   cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
    1375       208165 :   cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
    1376       208165 :   cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
    1377       208165 :   cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
    1378       208165 :   cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
    1379       208165 :   cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
    1380              : 
    1381              :   /* This can't happen until after wchar_precision and bytes_big_endian
    1382              :      are known.  */
    1383       208165 :   cpp_init_iconv (parse_in);
    1384              : 
    1385       208165 :   if (version_flag)
    1386              :     {
    1387          110 :       int i;
    1388          110 :       fputs ("Compiler executable checksum: ", stderr);
    1389         1980 :       for (i = 0; i < 16; i++)
    1390         1760 :         fprintf (stderr, "%02x", executable_checksum[i]);
    1391          110 :       putc ('\n', stderr);
    1392              :     }
    1393              : 
    1394              :   /* Has to wait until now so that cpplib has its hash table.  */
    1395       208165 :   init_pragma ();
    1396              : 
    1397       208165 :   if (flag_preprocess_only)
    1398              :     {
    1399         6767 :       c_init_preprocess ();
    1400         6767 :       c_finish_options ();
    1401         6767 :       preprocess_file (parse_in);
    1402         6767 :       return false;
    1403              :     }
    1404              : 
    1405              :   return true;
    1406              : }
    1407              : 
    1408              : /* Initialize the integrated preprocessor after debug output has been
    1409              :    initialized; loop over each input file.  */
    1410              : void
    1411       201398 : c_common_parse_file (void)
    1412              : {
    1413       201398 :   auto dumps = g->get_dumps ();
    1414       201398 :   for (unsigned int i = 0;;)
    1415              :     {
    1416       201398 :       c_finish_options ();
    1417              :       /* Open the dump file to use for the original dump output
    1418              :          here, to be used during parsing for the current file.  */
    1419       201398 :       dumps->dump_start (TDI_original, &dump_flags);
    1420       201398 :       pch_init ();
    1421       201398 :       push_file_scope ();
    1422       201398 :       c_parse_file ();
    1423       201103 :       pop_file_scope ();
    1424              :       /* And end the main input file, if the debug writer wants it  */
    1425       201103 :       if (debug_hooks->start_end_main_source_file)
    1426        39328 :         (*debug_hooks->end_source_file) (0);
    1427       201103 :       if (++i >= num_in_fnames)
    1428              :         break;
    1429            0 :       cpp_undef_all (parse_in);
    1430            0 :       cpp_clear_file_cache (parse_in);
    1431            0 :       this_input_filename
    1432            0 :         = cpp_read_main_file (parse_in, in_fnames[i]);
    1433              :       /* If an input file is missing, abandon further compilation.
    1434              :          cpplib has issued a diagnostic.  */
    1435            0 :       if (!this_input_filename)
    1436              :         break;
    1437            0 :       dumps->dump_finish (TDI_original);
    1438              :     }
    1439              : 
    1440       201103 :   c_parse_final_cleanups ();
    1441       201091 :   dumps->dump_finish (TDI_original);
    1442       201091 : }
    1443              : 
    1444              : /* Common finish hook for the C, ObjC and C++ front ends.  */
    1445              : void
    1446       207664 : c_common_finish (void)
    1447              : {
    1448       207664 :   FILE *deps_stream = NULL;
    1449       207664 :   FILE *fdeps_stream = NULL;
    1450              : 
    1451              :   /* Note that we write the dependencies even if there are errors. This is
    1452              :      useful for handling outdated generated headers that now trigger errors
    1453              :      (for example, with #error) which would be resolved by re-generating
    1454              :      them. In a sense, this complements -MG.  */
    1455       207664 :   if (cpp_opts->deps.style != DEPS_NONE)
    1456              :     {
    1457              :       /* If -M or -MM was seen without -MF, default output to the
    1458              :          output stream.  */
    1459         5915 :       if (!deps_file)
    1460           25 :         deps_stream = out_stream;
    1461         5890 :       else if (deps_file[0] == '-' && deps_file[1] == '\0')
    1462            0 :         deps_stream = stdout;
    1463              :       else
    1464              :         {
    1465        11780 :           deps_stream = fopen (deps_file, deps_append ? "a" : "w");
    1466         5890 :           if (!deps_stream)
    1467            0 :             fatal_error (input_location, "opening dependency file %s: %m",
    1468              :                          deps_file);
    1469              :         }
    1470              :     }
    1471              : 
    1472              :   /* When we call cpp_finish (), it may generate some diagnostics using
    1473              :      locations it remembered from the preprocessing phase, e.g. for
    1474              :      -Wunused-macros.  So inform c_cpp_diagnostic () not to override those
    1475              :      locations with input_location, which would be incorrect now.  */
    1476       207664 :   override_libcpp_locations = false;
    1477              : 
    1478       207664 :   if (cpp_opts->deps.fdeps_format != FDEPS_FMT_NONE)
    1479              :     {
    1480           36 :       if (!fdeps_file)
    1481            0 :         fdeps_stream = out_stream;
    1482           36 :       else if (fdeps_file[0] == '-' && fdeps_file[1] == '\0')
    1483            0 :         fdeps_stream = stdout;
    1484              :       else
    1485              :         {
    1486           36 :           fdeps_stream = fopen (fdeps_file, "w");
    1487           36 :           if (!fdeps_stream)
    1488            0 :             fatal_error (input_location, "opening dependency file %s: %m",
    1489              :                          fdeps_file);
    1490              :         }
    1491           36 :       if (fdeps_stream == deps_stream && fdeps_stream != stdout)
    1492            0 :         fatal_error (input_location, "%<-MF%> and %<-fdeps-file=%> cannot share an output file %s: %m",
    1493            0 :                      fdeps_file ? fdeps_file : out_fname);
    1494              :     }
    1495              : 
    1496              :   /* For performance, avoid tearing down cpplib's internal structures
    1497              :      with cpp_destroy ().  */
    1498       207664 :   cpp_finish (parse_in, deps_stream, fdeps_stream);
    1499              : 
    1500         5915 :   if (deps_stream && deps_stream != out_stream && deps_stream != stdout
    1501       213554 :       && (ferror (deps_stream) || fclose (deps_stream)))
    1502            0 :     fatal_error (input_location, "closing dependency file %s: %m", deps_file);
    1503              : 
    1504       207664 :   if (out_stream && (ferror (out_stream) || fclose (out_stream)))
    1505            0 :     fatal_error (input_location, "when writing output to %s: %m", out_fname);
    1506       207664 : }
    1507              : 
    1508              : /* Either of two environment variables can specify output of
    1509              :    dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
    1510              :    DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
    1511              :    and DEPS_TARGET is the target to mention in the deps.  They also
    1512              :    result in dependency information being appended to the output file
    1513              :    rather than overwriting it, and like Sun's compiler
    1514              :    SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
    1515              : static void
    1516       202460 : check_deps_environment_vars (void)
    1517              : {
    1518       202460 :   char *spec;
    1519              : 
    1520       202460 :   spec = getenv ("DEPENDENCIES_OUTPUT");
    1521       202460 :   if (spec)
    1522            0 :     cpp_opts->deps.style = DEPS_USER;
    1523              :   else
    1524              :     {
    1525       202460 :       spec = getenv ("SUNPRO_DEPENDENCIES");
    1526       202460 :       if (spec)
    1527              :         {
    1528            0 :           cpp_opts->deps.style = DEPS_SYSTEM;
    1529            0 :           cpp_opts->deps.ignore_main_file = true;
    1530              :         }
    1531              :     }
    1532              : 
    1533            0 :   if (spec)
    1534              :     {
    1535              :       /* Find the space before the DEPS_TARGET, if there is one.  */
    1536            0 :       char *s = strchr (spec, ' ');
    1537            0 :       if (s)
    1538              :         {
    1539              :           /* Let the caller perform MAKE quoting.  */
    1540            0 :           defer_opt (OPT_MT, s + 1);
    1541            0 :           *s = '\0';
    1542              :         }
    1543              : 
    1544              :       /* Command line -MF overrides environment variables and default.  */
    1545            0 :       if (!deps_file)
    1546            0 :         deps_file = spec;
    1547              : 
    1548            0 :       deps_append = 1;
    1549            0 :       deps_seen = true;
    1550              :     }
    1551       202460 : }
    1552              : 
    1553              : /* Handle deferred command line switches.  */
    1554              : static void
    1555       208380 : handle_deferred_opts (void)
    1556              : {
    1557              :   /* Avoid allocating the deps buffer if we don't need it.
    1558              :      (This flag may be true without there having been -MT or -MQ
    1559              :      options, but we'll still need the deps buffer.)  */
    1560       208380 :   if (!deps_seen)
    1561              :     return;
    1562              : 
    1563         5919 :   if (mkdeps *deps = cpp_get_deps (parse_in))
    1564        35022 :     for (unsigned i = 0; i < deferred_count; i++)
    1565              :       {
    1566        29127 :         struct deferred_opt *opt = &deferred_opts[i];
    1567              : 
    1568        29127 :         if (opt->code == OPT_MT || opt->code == OPT_MQ)
    1569         5888 :           deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
    1570        23239 :         else if (opt->code == OPT_fdeps_target_)
    1571           42 :           fdeps_add_target (deps, opt->arg, true);
    1572              :       }
    1573              : }
    1574              : 
    1575              : /* These settings are appropriate for GCC, but not necessarily so for
    1576              :    cpplib as a library.  */
    1577              : static void
    1578       208380 : sanitize_cpp_opts (void)
    1579              : {
    1580              :   /* If we don't know what style of dependencies to output, complain
    1581              :      if any other dependency switches have been given.  */
    1582       208380 :   if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
    1583           24 :     error ("to generate dependencies you must specify either %<-M%> "
    1584              :            "or %<-MM%>");
    1585              : 
    1586              :   /* -dM and dependencies suppress normal output; do it here so that
    1587              :      the last -d[MDN] switch overrides earlier ones.  */
    1588       208380 :   if (flag_dump_macros == 'M')
    1589           80 :     flag_no_output = 1;
    1590              : 
    1591              :   /* By default, -fdirectives-only implies -dD.  This allows subsequent phases
    1592              :      to perform proper macro expansion.  */
    1593       208380 :   if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
    1594           80 :     flag_dump_macros = 'D';
    1595              : 
    1596              :   /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
    1597              :      -dM since at least glibc relies on -M -dM to work.  */
    1598              :   /* Also, flag_no_output implies flag_no_line_commands, always.  */
    1599       208380 :   if (flag_no_output)
    1600              :     {
    1601          107 :       if (flag_dump_macros != 'M')
    1602           27 :         flag_dump_macros = 0;
    1603          107 :       flag_dump_includes = 0;
    1604          107 :       flag_no_line_commands = 1;
    1605              :     }
    1606       208273 :   else if (cpp_opts->deps.missing_files)
    1607            1 :     error ("%<-MG%> may only be used with %<-M%> or %<-MM%>");
    1608              : 
    1609       208380 :   cpp_opts->unsigned_char = !flag_signed_char;
    1610       208380 :   cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
    1611              : 
    1612              :   /* Wlong-long is disabled by default. It is enabled by:
    1613              :       [-Wpedantic | -Wtraditional] -std=[gnu|c]++98 ; or
    1614              :       [-Wpedantic | -Wtraditional] -std=non-c99
    1615              : 
    1616              :       Either -Wlong-long or -Wno-long-long override any other settings.
    1617              :       ??? These conditions should be handled in c.opt.  */
    1618       208380 :   if (warn_long_long == -1)
    1619              :     {
    1620       159517 :       warn_long_long = ((pedantic || warn_traditional)
    1621       163248 :                         && (c_dialect_cxx () ? cxx_dialect == cxx98 : !flag_isoc99));
    1622       163224 :       cpp_opts->cpp_warn_long_long = warn_long_long;
    1623              :     }
    1624              : 
    1625              :   /* If we're generating preprocessor output, emit current directory
    1626              :      if explicitly requested or if debugging information is enabled.
    1627              :      ??? Maybe we should only do it for debugging formats that
    1628              :      actually output the current directory?  */
    1629       208380 :   if (flag_working_directory == -1)
    1630       207085 :     flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
    1631              : 
    1632       208380 :   if (warn_implicit_fallthrough < 5)
    1633       208376 :     cpp_opts->cpp_warn_implicit_fallthrough = warn_implicit_fallthrough;
    1634              :   else
    1635            4 :     cpp_opts->cpp_warn_implicit_fallthrough = 0;
    1636              : 
    1637       208380 :   if (cpp_opts->directives_only)
    1638              :     {
    1639          121 :       if (cpp_warn_unused_macros)
    1640            4 :         error ("%<-fdirectives-only%> is incompatible "
    1641              :                "with %<-Wunused-macros%>");
    1642          121 :       if (cpp_opts->traditional)
    1643            1 :         error ("%<-fdirectives-only%> is incompatible with %<-traditional%>");
    1644              :     }
    1645       208380 : }
    1646              : 
    1647              : /* Add include path with a prefix at the front of its name.  */
    1648              : static void
    1649            0 : add_prefixed_path (const char *suffix, incpath_kind chain)
    1650              : {
    1651            0 :   char *path;
    1652            0 :   const char *prefix;
    1653            0 :   size_t prefix_len, suffix_len;
    1654              : 
    1655            0 :   suffix_len = strlen (suffix);
    1656            0 :   prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
    1657            0 :   prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
    1658              : 
    1659            0 :   path = (char *) xmalloc (prefix_len + suffix_len + 1);
    1660            0 :   memcpy (path, prefix, prefix_len);
    1661            0 :   memcpy (path + prefix_len, suffix, suffix_len);
    1662            0 :   path[prefix_len + suffix_len] = '\0';
    1663              : 
    1664            0 :   add_path (path, chain, 0, false);
    1665            0 : }
    1666              : 
    1667              : /* Handle -D, -U, -A, -imacros, and the first -include.  */
    1668              : static void
    1669       208165 : c_finish_options (void)
    1670              : {
    1671       208165 :   if (!cpp_opts->preprocessed)
    1672              :     {
    1673       207638 :       const line_map_ordinary *bltin_map
    1674       207638 :         = linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0,
    1675              :                                                special_fname_builtin (), 0));
    1676       207638 :       cb_file_change (parse_in, bltin_map);
    1677       207638 :       linemap_line_start (line_table, 0, 1);
    1678              : 
    1679              :       /* Make sure all of the builtins about to be declared have
    1680              :          BUILTINS_LOCATION has their location_t.  */
    1681       207638 :       cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
    1682              : 
    1683       207638 :       cpp_init_builtins (parse_in, flag_hosted);
    1684       207638 :       c_cpp_builtins (parse_in);
    1685              : 
    1686              :       /* We're about to send user input to cpplib, so make it warn for
    1687              :          things that we previously (when we sent it internal definitions)
    1688              :          told it to not warn.
    1689              : 
    1690              :          C99 permits implementation-defined characters in identifiers.
    1691              :          The documented meaning of -std= is to turn off extensions that
    1692              :          conflict with the specified standard, and since a strictly
    1693              :          conforming program cannot contain a '$', we do not condition
    1694              :          their acceptance on the -std= setting.  */
    1695       207638 :       cpp_opts->warn_dollars = (cpp_opts->cpp_pedantic && !cpp_opts->c99);
    1696              : 
    1697       207638 :       const line_map_ordinary *cmd_map
    1698       207638 :         = linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0,
    1699       207638 :                                                _("<command-line>"), 0));
    1700       207638 :       cb_file_change (parse_in, cmd_map);
    1701       207638 :       linemap_line_start (line_table, 0, 1);
    1702              : 
    1703       207638 :       bool fortify_seen_p = false;
    1704       207638 :       bool cxx_assert_seen_p = false;
    1705              : 
    1706              :       /* All command line defines must have the same location.  */
    1707       207638 :       line_table->cmdline_location = line_table->highest_line;
    1708       207638 :       cpp_force_token_locations (parse_in, line_table->highest_line);
    1709       386489 :       for (size_t i = 0; i < deferred_count; i++)
    1710              :         {
    1711       178851 :           struct deferred_opt *opt = &deferred_opts[i];
    1712              : 
    1713       178851 :           if (opt->code == OPT_D)
    1714       163516 :             cpp_define (parse_in, opt->arg);
    1715        15335 :           else if (opt->code == OPT_U)
    1716           60 :             cpp_undef (parse_in, opt->arg);
    1717        15275 :           else if (opt->code == OPT_A)
    1718              :             {
    1719           10 :               if (opt->arg[0] == '-')
    1720            2 :                 cpp_unassert (parse_in, opt->arg + 1);
    1721              :               else
    1722            8 :                 cpp_assert (parse_in, opt->arg);
    1723              :             }
    1724              : 
    1725       178851 :           if (UNLIKELY (flag_hardened)
    1726           83 :               && (opt->code == OPT_D || opt->code == OPT_U))
    1727              :             {
    1728           83 :               if (!fortify_seen_p)
    1729           79 :                 fortify_seen_p
    1730           79 :                   = (!strncmp (opt->arg, "_FORTIFY_SOURCE", 15)
    1731           79 :                      && (opt->arg[15] == '\0' || opt->arg[15] == '='));
    1732           83 :               if (!cxx_assert_seen_p)
    1733           83 :                 cxx_assert_seen_p
    1734           83 :                   = (!strncmp (opt->arg, "_GLIBCXX_ASSERTIONS", 19)
    1735           83 :                      && (opt->arg[19] == '\0' || opt->arg[19] == '='));
    1736              :             }
    1737              :         }
    1738              : 
    1739       207638 :       if (flag_hardened)
    1740              :         {
    1741           91 :           if (!fortify_seen_p && optimize > 0)
    1742           71 :             cpp_define_formatted (parse_in, "_FORTIFY_SOURCE=%u",
    1743           71 :                                   targetm.fortify_source_default_level ());
    1744           20 :           else if (optimize == 0)
    1745           20 :             warning_at (UNKNOWN_LOCATION, OPT_Whardened,
    1746              :                         "%<_FORTIFY_SOURCE%> is not enabled by %<-fhardened%> "
    1747              :                         "because optimizations are turned off");
    1748              :           else
    1749            0 :             warning_at (UNKNOWN_LOCATION, OPT_Whardened,
    1750              :                         "%<_FORTIFY_SOURCE%> is not enabled by %<-fhardened%> "
    1751              :                         "because it was specified in %<-D%> or %<-U%>");
    1752           91 :           if (!cxx_assert_seen_p)
    1753           87 :             cpp_define (parse_in, "_GLIBCXX_ASSERTIONS");
    1754              :           else
    1755            4 :             warning_at (UNKNOWN_LOCATION, OPT_Whardened,
    1756              :                         "%<_GLIBCXX_ASSERTIONS%> is not enabled by "
    1757              :                         "%<-fhardened%> because it was specified in %<-D%> "
    1758              :                         "or %<-U%>");
    1759              :         }
    1760              : 
    1761       207638 :       cpp_stop_forcing_token_locations (parse_in);
    1762              :     }
    1763          527 :   else if (cpp_opts->directives_only)
    1764           41 :     cpp_init_special_builtins (parse_in);
    1765              : 
    1766              :   /* Start the main input file, if the debug writer wants it. */
    1767       208165 :   if (debug_hooks->start_end_main_source_file
    1768        41693 :       && !flag_preprocess_only)
    1769        39444 :     (*debug_hooks->start_source_file) (0, this_input_filename);
    1770              : 
    1771       208165 :   if (!cpp_opts->preprocessed)
    1772              :     /* Handle -imacros after -D and -U.  */
    1773       386489 :     for (size_t i = 0; i < deferred_count; i++)
    1774              :       {
    1775       178851 :         struct deferred_opt *opt = &deferred_opts[i];
    1776              : 
    1777       178851 :         if (opt->code == OPT_imacros
    1778       178851 :             && cpp_push_include (parse_in, opt->arg))
    1779              :           {
    1780              :             /* Disable push_command_line_include callback for now.  */
    1781            8 :             include_cursor = deferred_count + 1;
    1782            8 :             cpp_scan_nooutput (parse_in);
    1783              :           }
    1784              :       }
    1785              : 
    1786       208165 :   include_cursor = 0;
    1787       208165 :   push_command_line_include ();
    1788       208165 : }
    1789              : 
    1790              : /* Give CPP the next file given by -include, if any.  */
    1791              : static void
    1792       736754 : push_command_line_include (void)
    1793              : {
    1794              :   /* This can happen if disabled by -imacros for example.
    1795              :      Punt so that we don't set "<command-line>" as the filename for
    1796              :      the header.  */
    1797       736754 :   if (include_cursor > deferred_count)
    1798              :     return;
    1799              : 
    1800       425045 :   if (!done_preinclude)
    1801              :     {
    1802       208165 :       done_preinclude = true;
    1803       208165 :       if (flag_hosted && std_inc && !cpp_opts->preprocessed)
    1804              :         {
    1805       207556 :           const char *preinc = targetcm.c_preinclude ();
    1806       207556 :           if (preinc && cpp_push_default_include (parse_in, preinc))
    1807              :             return;
    1808              :         }
    1809              :     }
    1810              : 
    1811       217489 :   pch_cpp_save_state ();
    1812              : 
    1813       604556 :   while (include_cursor < deferred_count)
    1814              :     {
    1815       178903 :       struct deferred_opt *opt = &deferred_opts[include_cursor++];
    1816              : 
    1817       357753 :       if (!cpp_opts->preprocessed && opt->code == OPT_include
    1818       188231 :           && cpp_push_include (parse_in, opt->arg))
    1819              :         return;
    1820              :     }
    1821              : 
    1822       208164 :   if (include_cursor == deferred_count)
    1823              :     {
    1824       208164 :       include_cursor++;
    1825              :       /* -Wunused-macros should only warn about macros defined hereafter.  */
    1826       208164 :       cpp_opts->warn_unused_macros = cpp_warn_unused_macros;
    1827              :       /* Restore the line map back to the main file.  */
    1828       208164 :       if (!cpp_opts->preprocessed)
    1829              :         {
    1830       207637 :           cpp_change_file (parse_in, LC_RENAME, this_input_filename);
    1831       207637 :           if (lang_hooks.preprocess_main_file)
    1832              :             /* We're starting the main file.  Inform the FE of that.  */
    1833        97228 :             lang_hooks.preprocess_main_file
    1834        97228 :               (parse_in, line_table, LINEMAPS_LAST_ORDINARY_MAP (line_table));
    1835              :         }
    1836              : 
    1837              :       /* Set this here so the client can change the option if it wishes,
    1838              :          and after stacking the main file so we don't trace the main file.  */
    1839       208164 :       line_table->trace_includes = cpp_opts->print_include_names;
    1840              :     }
    1841              : }
    1842              : 
    1843              : /* File change callback.  Has to handle -include files.  */
    1844              : static void
    1845     20055877 : cb_file_change (cpp_reader *reader, const line_map_ordinary *new_map)
    1846              : {
    1847     20055877 :   if (flag_preprocess_only)
    1848       157702 :     pp_file_change (new_map);
    1849              :   else
    1850     19898175 :     fe_file_change (new_map);
    1851              : 
    1852     19848107 :   if (new_map && cpp_opts->preprocessed
    1853        37951 :       && lang_hooks.preprocess_main_file && MAIN_FILE_P (new_map)
    1854     20058441 :       && ORDINARY_MAP_STARTING_LINE_NUMBER (new_map))
    1855              :     /* We're starting the main file.  Inform the FE of that.  */
    1856          450 :     lang_hooks.preprocess_main_file (reader, line_table, new_map);
    1857              : 
    1858     20055877 :   if (new_map
    1859     19848107 :       && (new_map->reason == LC_ENTER || new_map->reason == LC_RENAME))
    1860              :     {
    1861              :       /* Signal to plugins that a file is included.  This could happen
    1862              :          several times with the same file path, e.g. because of
    1863              :          several '#include' or '#line' directives...  */
    1864     10341856 :       invoke_plugin_callbacks
    1865     10341856 :         (PLUGIN_INCLUDE_FILE,
    1866     10341856 :          const_cast<char*> (ORDINARY_MAP_FILE_NAME (new_map)));
    1867              :     }
    1868              : 
    1869     19848107 :   if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
    1870              :     {
    1871       528589 :       pch_cpp_save_state ();
    1872       528589 :       push_command_line_include ();
    1873              :     }
    1874     20055876 : }
    1875              : 
    1876              : void
    1877           53 : cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
    1878              : {
    1879           53 :   if (!set_src_pwd (dir))
    1880            0 :     warning (0, "too late for # directive to set debug directory");
    1881           53 : }
    1882              : 
    1883              : /* Set the C 89 standard (with 1994 amendments if C94, without GNU
    1884              :    extensions if ISO).  There is no concept of gnu94.  */
    1885              : static void
    1886         6957 : set_std_c89 (int c94, int iso)
    1887              : {
    1888         9910 :   cpp_set_lang (parse_in, c94 ? CLK_STDC94 : iso ? CLK_STDC89 : CLK_GNUC89);
    1889         6957 :   flag_iso = iso;
    1890         6957 :   flag_no_asm = iso;
    1891         6957 :   flag_no_gnu_keywords = iso;
    1892         6957 :   flag_no_nonansi_builtin = iso;
    1893         6957 :   flag_isoc94 = c94;
    1894         6957 :   flag_isoc99 = 0;
    1895         6957 :   flag_isoc11 = 0;
    1896         6957 :   flag_isoc23 = 0;
    1897         6957 :   flag_isoc2y = 0;
    1898         6957 :   lang_hooks.name = "GNU C89";
    1899         6957 : }
    1900              : 
    1901              : /* Set the C 99 standard (without GNU extensions if ISO).  */
    1902              : static void
    1903         1188 : set_std_c99 (int iso)
    1904              : {
    1905         1802 :   cpp_set_lang (parse_in, iso ? CLK_STDC99 : CLK_GNUC99);
    1906         1188 :   flag_no_asm = iso;
    1907         1188 :   flag_no_nonansi_builtin = iso;
    1908         1188 :   flag_iso = iso;
    1909         1188 :   flag_isoc2y = 0;
    1910         1188 :   flag_isoc23 = 0;
    1911         1188 :   flag_isoc11 = 0;
    1912         1188 :   flag_isoc99 = 1;
    1913         1188 :   flag_isoc94 = 1;
    1914         1188 :   lang_hooks.name = "GNU C99";
    1915         1188 : }
    1916              : 
    1917              : /* Set the C 11 standard (without GNU extensions if ISO).  */
    1918              : static void
    1919         4226 : set_std_c11 (int iso)
    1920              : {
    1921         7938 :   cpp_set_lang (parse_in, iso ? CLK_STDC11 : CLK_GNUC11);
    1922         4226 :   flag_no_asm = iso;
    1923         4226 :   flag_no_nonansi_builtin = iso;
    1924         4226 :   flag_iso = iso;
    1925         4226 :   flag_isoc2y = 0;
    1926         4226 :   flag_isoc23 = 0;
    1927         4226 :   flag_isoc11 = 1;
    1928         4226 :   flag_isoc99 = 1;
    1929         4226 :   flag_isoc94 = 1;
    1930         4226 :   lang_hooks.name = "GNU C11";
    1931         4226 : }
    1932              : 
    1933              : /* Set the C 17 standard (without GNU extensions if ISO).  */
    1934              : static void
    1935          826 : set_std_c17 (int iso)
    1936              : {
    1937         1610 :   cpp_set_lang (parse_in, iso ? CLK_STDC17 : CLK_GNUC17);
    1938          826 :   flag_no_asm = iso;
    1939          826 :   flag_no_nonansi_builtin = iso;
    1940          826 :   flag_iso = iso;
    1941          826 :   flag_isoc2y = 0;
    1942          826 :   flag_isoc23 = 0;
    1943          826 :   flag_isoc11 = 1;
    1944          826 :   flag_isoc99 = 1;
    1945          826 :   flag_isoc94 = 1;
    1946          826 :   lang_hooks.name = "GNU C17";
    1947          826 : }
    1948              : 
    1949              : /* Set the C 23 standard (without GNU extensions if ISO).  */
    1950              : static void
    1951       112040 : set_std_c23 (int iso)
    1952              : {
    1953       223212 :   cpp_set_lang (parse_in, iso ? CLK_STDC23 : CLK_GNUC23);
    1954       112040 :   flag_no_asm = iso;
    1955       112040 :   flag_no_nonansi_builtin = iso;
    1956       112040 :   flag_iso = iso;
    1957       112040 :   flag_isoc2y = 0;
    1958       112040 :   flag_isoc23 = 1;
    1959       112040 :   flag_isoc11 = 1;
    1960       112040 :   flag_isoc99 = 1;
    1961       112040 :   flag_isoc94 = 1;
    1962       112040 :   lang_hooks.name = "GNU C23";
    1963       112040 : }
    1964              : 
    1965              : /* Set the C 2Y standard (without GNU extensions if ISO).  */
    1966              : static void
    1967          188 : set_std_c2y (int iso)
    1968              : {
    1969          199 :   cpp_set_lang (parse_in, iso ? CLK_STDC2Y : CLK_GNUC2Y);
    1970          188 :   flag_no_asm = iso;
    1971          188 :   flag_no_nonansi_builtin = iso;
    1972          188 :   flag_iso = iso;
    1973          188 :   flag_isoc2y = 1;
    1974          188 :   flag_isoc23 = 1;
    1975          188 :   flag_isoc11 = 1;
    1976          188 :   flag_isoc99 = 1;
    1977          188 :   flag_isoc94 = 1;
    1978          188 :   lang_hooks.name = "GNU C2Y";
    1979          188 : }
    1980              : 
    1981              : 
    1982              : /* Set the C++ 98 standard (without GNU extensions if ISO).  */
    1983              : static void
    1984        14246 : set_std_cxx98 (int iso)
    1985              : {
    1986        19626 :   cpp_set_lang (parse_in, iso ? CLK_CXX98 : CLK_GNUCXX);
    1987        14246 :   flag_no_gnu_keywords = iso;
    1988        14246 :   flag_no_nonansi_builtin = iso;
    1989        14246 :   flag_iso = iso;
    1990        14246 :   flag_isoc94 = 0;
    1991        14246 :   flag_isoc99 = 0;
    1992        14246 :   cxx_dialect = cxx98;
    1993        14246 :   lang_hooks.name = "GNU C++98";
    1994        14246 : }
    1995              : 
    1996              : /* Set the C++ 2011 standard (without GNU extensions if ISO).  */
    1997              : static void
    1998         5645 : set_std_cxx11 (int iso)
    1999              : {
    2000         7081 :   cpp_set_lang (parse_in, iso ? CLK_CXX11 : CLK_GNUCXX11);
    2001         5645 :   flag_no_gnu_keywords = iso;
    2002         5645 :   flag_no_nonansi_builtin = iso;
    2003         5645 :   flag_iso = iso;
    2004              :   /* C++11 includes the C99 standard library.  */
    2005         5645 :   flag_isoc94 = 1;
    2006         5645 :   flag_isoc99 = 1;
    2007         5645 :   cxx_dialect = cxx11;
    2008         5645 :   lang_hooks.name = "GNU C++11";
    2009         5645 : }
    2010              : 
    2011              : /* Set the C++ 2014 standard (without GNU extensions if ISO).  */
    2012              : static void
    2013         1286 : set_std_cxx14 (int iso)
    2014              : {
    2015         1562 :   cpp_set_lang (parse_in, iso ? CLK_CXX14 : CLK_GNUCXX14);
    2016         1286 :   flag_no_gnu_keywords = iso;
    2017         1286 :   flag_no_nonansi_builtin = iso;
    2018         1286 :   flag_iso = iso;
    2019              :   /* C++14 includes the C99 standard library.  */
    2020         1286 :   flag_isoc94 = 1;
    2021         1286 :   flag_isoc99 = 1;
    2022         1286 :   cxx_dialect = cxx14;
    2023         1286 :   lang_hooks.name = "GNU C++14";
    2024         1286 : }
    2025              : 
    2026              : /* Set the C++ 2017 standard (without GNU extensions if ISO).  */
    2027              : static void
    2028         4141 : set_std_cxx17 (int iso)
    2029              : {
    2030         5068 :   cpp_set_lang (parse_in, iso ? CLK_CXX17 : CLK_GNUCXX17);
    2031         4141 :   flag_no_gnu_keywords = iso;
    2032         4141 :   flag_no_nonansi_builtin = iso;
    2033         4141 :   flag_iso = iso;
    2034              :   /* C++17 includes the C11 standard library.  */
    2035         4141 :   flag_isoc94 = 1;
    2036         4141 :   flag_isoc99 = 1;
    2037         4141 :   flag_isoc11 = 1;
    2038         4141 :   cxx_dialect = cxx17;
    2039         4141 :   lang_hooks.name = "GNU C++17";
    2040         4141 : }
    2041              : 
    2042              : /* Set the C++ 2020 standard (without GNU extensions if ISO).  */
    2043              : static void
    2044       129396 : set_std_cxx20 (int iso)
    2045              : {
    2046       242299 :   cpp_set_lang (parse_in, iso ? CLK_CXX20 : CLK_GNUCXX20);
    2047       129396 :   flag_no_gnu_keywords = iso;
    2048       129396 :   flag_no_nonansi_builtin = iso;
    2049       129396 :   flag_iso = iso;
    2050              :   /* C++20 includes the C11 standard library.  */
    2051       129396 :   flag_isoc94 = 1;
    2052       129396 :   flag_isoc99 = 1;
    2053       129396 :   flag_isoc11 = 1;
    2054       129396 :   cxx_dialect = cxx20;
    2055       129396 :   lang_hooks.name = "GNU C++20";
    2056       129396 : }
    2057              : 
    2058              : /* Set the C++ 2023 standard (without GNU extensions if ISO).  */
    2059              : static void
    2060         2055 : set_std_cxx23 (int iso)
    2061              : {
    2062         2598 :   cpp_set_lang (parse_in, iso ? CLK_CXX23 : CLK_GNUCXX23);
    2063         2055 :   flag_no_gnu_keywords = iso;
    2064         2055 :   flag_no_nonansi_builtin = iso;
    2065         2055 :   flag_iso = iso;
    2066              :   /* C++23 includes the C11 standard library.  */
    2067         2055 :   flag_isoc94 = 1;
    2068         2055 :   flag_isoc99 = 1;
    2069         2055 :   flag_isoc11 = 1;
    2070         2055 :   cxx_dialect = cxx23;
    2071         2055 :   lang_hooks.name = "GNU C++23";
    2072         2055 : }
    2073              : 
    2074              : /* Set the C++ 2026 standard (without GNU extensions if ISO).  */
    2075              : static void
    2076        23530 : set_std_cxx26 (int iso)
    2077              : {
    2078        30410 :   cpp_set_lang (parse_in, iso ? CLK_CXX26 : CLK_GNUCXX26);
    2079        23530 :   flag_no_gnu_keywords = iso;
    2080        23530 :   flag_no_nonansi_builtin = iso;
    2081        23530 :   flag_iso = iso;
    2082              :   /* C++26 includes the C11 standard library.  */
    2083        23530 :   flag_isoc94 = 1;
    2084        23530 :   flag_isoc99 = 1;
    2085        23530 :   flag_isoc11 = 1;
    2086        23530 :   cxx_dialect = cxx26;
    2087        23530 :   lang_hooks.name = "GNU C++26";
    2088        23530 : }
    2089              : 
    2090              : /* Args to -d specify what to dump.  Silently ignore
    2091              :    unrecognized options; they may be aimed at toplev.cc.  */
    2092              : static void
    2093         1661 : handle_OPT_d (const char *arg)
    2094              : {
    2095         1661 :   char c;
    2096              : 
    2097         3322 :   while ((c = *arg++) != '\0')
    2098         1661 :     switch (c)
    2099              :       {
    2100          820 :       case 'M':                 /* Dump macros only.  */
    2101          820 :       case 'N':                 /* Dump names.  */
    2102          820 :       case 'D':                 /* Dump definitions.  */
    2103          820 :       case 'U':                 /* Dump used macros.  */
    2104          820 :         flag_dump_macros = c;
    2105          820 :         break;
    2106              : 
    2107            2 :       case 'I':
    2108            2 :         flag_dump_includes = 1;
    2109            2 :         break;
    2110              :       }
    2111         1661 : }
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.