LCOV - code coverage report
Current view: top level - gcc/diagnostics - context.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 99.2 % 130 129
Test Date: 2025-09-20 13:40:47 Functions: 87.5 % 8 7
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Declare diagnostics::context and related types.
       2                 :             :    Copyright (C) 2000-2025 Free Software Foundation, Inc.
       3                 :             : 
       4                 :             : This file is part of GCC.
       5                 :             : 
       6                 :             : GCC is free software; you can redistribute it and/or modify it under
       7                 :             : the terms of the GNU General Public License as published by the Free
       8                 :             : Software Foundation; either version 3, or (at your option) any later
       9                 :             : version.
      10                 :             : 
      11                 :             : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12                 :             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13                 :             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14                 :             : for more details.
      15                 :             : 
      16                 :             : You should have received a copy of the GNU General Public License
      17                 :             : along with GCC; see the file COPYING3.  If not see
      18                 :             : <http://www.gnu.org/licenses/>.  */
      19                 :             : 
      20                 :             : #ifndef GCC_DIAGNOSTICS_CONTEXT_H
      21                 :             : #define GCC_DIAGNOSTICS_CONTEXT_H
      22                 :             : 
      23                 :             : #include "lazily-created.h"
      24                 :             : #include "unique-argv.h"
      25                 :             : #include "diagnostics/option-classifier.h"
      26                 :             : #include "diagnostics/option-id-manager.h"
      27                 :             : #include "diagnostics/context-options.h"
      28                 :             : #include "diagnostics/source-printing-options.h"
      29                 :             : #include "diagnostics/column-options.h"
      30                 :             : #include "diagnostics/counters.h"
      31                 :             : #include "diagnostics/logging.h"
      32                 :             : 
      33                 :             : namespace diagnostics {
      34                 :             : 
      35                 :             :   namespace changes {
      36                 :             :     class change_set;
      37                 :             :   }
      38                 :             : 
      39                 :             :   namespace digraphs { class digraph; }
      40                 :             : 
      41                 :             :   namespace logical_locations {
      42                 :             :     class manager;
      43                 :             :   }
      44                 :             : 
      45                 :             :   class buffer;
      46                 :             :   class client_data_hooks;
      47                 :             :   class diagram;
      48                 :             :   class sink;
      49                 :             :     class text_sink;
      50                 :             :   class metadata;
      51                 :             : 
      52                 :             :   class source_effect_info;
      53                 :             : 
      54                 :             : } // namespace diagnostics
      55                 :             : 
      56                 :             : namespace text_art
      57                 :             : {
      58                 :             :   class theme;
      59                 :             : } // namespace text_art
      60                 :             : 
      61                 :             : namespace xml
      62                 :             : {
      63                 :             :   class printer;
      64                 :             : } // namespace xml
      65                 :             : 
      66                 :             : namespace diagnostics {
      67                 :             : 
      68                 :             : /*  Forward declarations.  */
      69                 :             : class context;
      70                 :             : class location_print_policy;
      71                 :             : class source_print_policy;
      72                 :             : 
      73                 :             : typedef void (*text_starter_fn) (text_sink &,
      74                 :             :                                  const diagnostic_info *);
      75                 :             : 
      76                 :             : struct to_text;
      77                 :             : struct to_html;
      78                 :             : 
      79                 :             : extern pretty_printer *get_printer (to_text &);
      80                 :             : 
      81                 :             : template <typename TextOrHtml>
      82                 :             : using start_span_fn = void (*) (const location_print_policy &,
      83                 :             :                                 TextOrHtml &text_or_html,
      84                 :             :                                 expanded_location);
      85                 :             : 
      86                 :             : typedef void (*text_finalizer_fn) (text_sink &,
      87                 :             :                                    const diagnostic_info *,
      88                 :             :                                    enum kind);
      89                 :             : 
      90                 :             : /* A bundle of state for determining column numbers in diagnostics
      91                 :             :    (tab stops, whether to start at 0 or 1, etc).
      92                 :             :    Uses a file_cache to handle tabs.  */
      93                 :             : 
      94                 :             : class column_policy
      95                 :             : {
      96                 :             : public:
      97                 :             :   column_policy (const context &dc);
      98                 :             : 
      99                 :             :   int converted_column (expanded_location s) const;
     100                 :             : 
     101                 :             :   label_text get_location_text (const expanded_location &s,
     102                 :             :                                 bool show_column,
     103                 :             :                                 bool colorize) const;
     104                 :             : 
     105                 :       49643 :   int get_tabstop () const { return m_column_options.m_tabstop; }
     106                 :             : 
     107                 :             : private:
     108                 :             :   file_cache &m_file_cache;
     109                 :             :   column_options m_column_options;
     110                 :             : };
     111                 :             : 
     112                 :             : /* A bundle of state for printing locations within diagnostics
     113                 :             :    (e.g. "FILENAME:LINE:COLUMN"), to isolate the interactions between
     114                 :             :    context and the start_span callbacks.  */
     115                 :             : 
     116                 :             : class location_print_policy
     117                 :             : {
     118                 :             : public:
     119                 :             :   location_print_policy (const context &dc);
     120                 :             :   location_print_policy (const text_sink &);
     121                 :             : 
     122                 :     1206497 :   bool show_column_p () const { return m_show_column; }
     123                 :             : 
     124                 :             :   const column_policy &
     125                 :        1793 :   get_column_policy () const { return m_column_policy; }
     126                 :             : 
     127                 :             :   void
     128                 :             :   print_text_span_start (const context &dc,
     129                 :             :                          pretty_printer &pp,
     130                 :             :                          const expanded_location &exploc);
     131                 :             : 
     132                 :             :   void
     133                 :             :   print_html_span_start (const context &dc,
     134                 :             :                          xml::printer &xp,
     135                 :             :                          const expanded_location &exploc);
     136                 :             : 
     137                 :             : private:
     138                 :             :   column_policy m_column_policy;
     139                 :             :   bool m_show_column;
     140                 :             : };
     141                 :             : 
     142                 :             : /* Abstract base class for optionally supplying extra tags when writing
     143                 :             :    out annotation labels in HTML output.  */
     144                 :             : 
     145                 :           3 : class html_label_writer
     146                 :             : {
     147                 :             : public:
     148                 :           3 :   virtual ~html_label_writer () {}
     149                 :             :   virtual void begin_label () = 0;
     150                 :             :   virtual void end_label () = 0;
     151                 :             : };
     152                 :             : 
     153                 :             : /* A bundle of state for printing source within a diagnostic,
     154                 :             :    to isolate the interactions between context and the
     155                 :             :    implementation of diagnostic_show_locus.  */
     156                 :             : 
     157                 :             : class source_print_policy
     158                 :             : {
     159                 :             : public:
     160                 :             :   source_print_policy (const context &);
     161                 :             :   source_print_policy (const context &,
     162                 :             :                        const source_printing_options &);
     163                 :             : 
     164                 :             :   void
     165                 :             :   print (pretty_printer &pp,
     166                 :             :          const rich_location &richloc,
     167                 :             :          enum kind diagnostic_kind,
     168                 :             :          source_effect_info *effect_info) const;
     169                 :             : 
     170                 :             :   void
     171                 :             :   print_as_html (xml::printer &xp,
     172                 :             :                  const rich_location &richloc,
     173                 :             :                  enum kind diagnostic_kind,
     174                 :             :                  source_effect_info *effect_info,
     175                 :             :                  html_label_writer *label_writer) const;
     176                 :             : 
     177                 :             :   const source_printing_options &
     178                 :       49458 :   get_options () const { return m_options; }
     179                 :             : 
     180                 :             :   start_span_fn<to_text>
     181                 :        1793 :   get_text_start_span_fn () const { return m_text_start_span_cb; }
     182                 :             : 
     183                 :             :   start_span_fn<to_html>
     184                 :           1 :   get_html_start_span_fn () const { return m_html_start_span_cb; }
     185                 :             : 
     186                 :             :   file_cache &
     187                 :       49455 :   get_file_cache () const { return m_file_cache; }
     188                 :             : 
     189                 :             :   enum diagnostics_escape_format
     190                 :         554 :   get_escape_format () const
     191                 :             :   {
     192                 :         554 :     return m_escape_format;
     193                 :             :   }
     194                 :             : 
     195                 :             :   text_art::theme *
     196                 :       52106 :   get_diagram_theme () const { return m_diagram_theme; }
     197                 :             : 
     198                 :             :   const column_policy &get_column_policy () const
     199                 :             :   {
     200                 :       49643 :     return m_location_policy.get_column_policy ();
     201                 :             :   }
     202                 :             : 
     203                 :         463 :   const location_print_policy &get_location_policy () const
     204                 :             :   {
     205                 :         463 :     return m_location_policy;
     206                 :             :   }
     207                 :             : 
     208                 :             : private:
     209                 :             :   const source_printing_options &m_options;
     210                 :             :   location_print_policy m_location_policy;
     211                 :             :   start_span_fn<to_text> m_text_start_span_cb;
     212                 :             :   start_span_fn<to_html> m_html_start_span_cb;
     213                 :             :   file_cache &m_file_cache;
     214                 :             : 
     215                 :             :   /* Other data copied from context.  */
     216                 :             :   text_art::theme *m_diagram_theme;
     217                 :             :   enum diagnostics_escape_format m_escape_format;
     218                 :             : };
     219                 :             : 
     220                 :             : /* This class encapsulates the state of the diagnostics subsystem
     221                 :             :    as a whole (either directly, or via owned objects of other classes, to
     222                 :             :    avoid global variables).
     223                 :             : 
     224                 :             :    It has responsibility for:
     225                 :             :    - being a central place for clients to report diagnostics
     226                 :             :    - reporting those diagnostics to zero or more output sinks
     227                 :             :      (e.g. text vs SARIF)
     228                 :             :    - providing a "dump" member function for a debug dump of the state of
     229                 :             :      the diagnostics subsytem
     230                 :             :    - direct vs buffered diagnostics (see class diagnostics::buffer)
     231                 :             :    - tracking the original argv of the program (for SARIF output)
     232                 :             :    - crash-handling
     233                 :             : 
     234                 :             :    It delegates responsibility to various other classes:
     235                 :             :    - the various output sinks (instances of diagnostics::sink
     236                 :             :      subclasses)
     237                 :             :    - formatting of messages (class pretty_printer)
     238                 :             :    - an optional urlifier to inject URLs into formatted messages
     239                 :             :    - counting the number of diagnostics reported of each kind
     240                 :             :      (class diagnostics::counters)
     241                 :             :    - calling out to a option_id_manager to determine if
     242                 :             :      a particular warning is enabled or disabled
     243                 :             :    - tracking pragmas that enable/disable warnings in a range of
     244                 :             :      source code
     245                 :             :    - a cache for use when quoting the user's source code (class file_cache)
     246                 :             :    - a text_art::theme
     247                 :             :    - a diagnostics::changes::change_set for generating patches from fix-it hints
     248                 :             :    - diagnostics::client_data_hooks for metadata.
     249                 :             : 
     250                 :             :    Try to avoid adding new responsibilities to this class itself, to avoid
     251                 :             :    the "blob" anti-pattern.  */
     252                 :             : 
     253                 :       38588 : class context
     254                 :             : {
     255                 :             : public:
     256                 :             :   /* Give access to m_text_callbacks.  */
     257                 :             :   // FIXME: these need updating
     258                 :             :   friend text_starter_fn &
     259                 :             :   text_starter (context *dc);
     260                 :             :   friend start_span_fn<to_text> &
     261                 :             :   start_span (context *dc);
     262                 :             :   friend text_finalizer_fn &
     263                 :             :   text_finalizer (context *dc);
     264                 :             : 
     265                 :             :   friend class source_print_policy;
     266                 :             :   friend class text_sink;
     267                 :             :   friend class buffer;
     268                 :             : 
     269                 :             :   typedef void (*set_locations_callback_t) (const context &,
     270                 :             :                                             diagnostic_info *);
     271                 :             : 
     272                 :             :   void initialize (int n_opts);
     273                 :             :   void color_init (int value);
     274                 :             :   void urls_init (int value);
     275                 :             :   void set_pretty_printer (std::unique_ptr<pretty_printer> pp);
     276                 :             :   void refresh_output_sinks ();
     277                 :             : 
     278                 :             :   void finish ();
     279                 :             : 
     280                 :             :   void dump (FILE *out, int indent) const;
     281                 :           0 :   void DEBUG_FUNCTION dump () const { dump (stderr, 0); }
     282                 :             : 
     283                 :   194966217 :   logging::logger *get_logger () { return m_logger; }
     284                 :             : 
     285                 :             :   bool execution_failed_p () const;
     286                 :             : 
     287                 :             :   void set_original_argv (unique_argv original_argv);
     288                 :         405 :   const char * const *get_original_argv ()
     289                 :             :   {
     290                 :         405 :     return const_cast<const char * const *> (m_original_argv);
     291                 :             :   }
     292                 :             : 
     293                 :      339415 :   void set_set_locations_callback (set_locations_callback_t cb)
     294                 :             :   {
     295                 :      339415 :     m_set_locations_cb = cb;
     296                 :             :   }
     297                 :             : 
     298                 :             :   void
     299                 :             :   initialize_input_context (diagnostic_input_charset_callback ccb,
     300                 :             :                             bool should_skip_bom);
     301                 :             : 
     302                 :             :   void begin_group ();
     303                 :             :   void end_group ();
     304                 :             : 
     305                 :             :   void push_nesting_level ();
     306                 :             :   void pop_nesting_level ();
     307                 :             :   void set_nesting_level (int new_level);
     308                 :             : 
     309                 :             :   bool warning_enabled_at (location_t loc, option_id opt_id);
     310                 :             : 
     311                 :     1075077 :   bool option_unspecified_p (option_id opt_id) const
     312                 :             :   {
     313                 :     1075077 :     return m_option_classifier.option_unspecified_p (opt_id);
     314                 :             :   }
     315                 :             : 
     316                 :             :   bool emit_diagnostic_with_group (enum kind kind,
     317                 :             :                                    rich_location &richloc,
     318                 :             :                                    const metadata *metadata,
     319                 :             :                                    option_id opt_id,
     320                 :             :                                    const char *gmsgid, ...)
     321                 :             :     ATTRIBUTE_GCC_DIAG(6,7);
     322                 :             :   bool emit_diagnostic_with_group_va (enum kind kind,
     323                 :             :                                       rich_location &richloc,
     324                 :             :                                       const metadata *metadata,
     325                 :             :                                       option_id opt_id,
     326                 :             :                                       const char *gmsgid, va_list *ap)
     327                 :             :     ATTRIBUTE_GCC_DIAG(6,0);
     328                 :             : 
     329                 :             :   bool report_diagnostic (diagnostic_info *);
     330                 :             :   void report_verbatim (text_info &);
     331                 :             : 
     332                 :             :   /* Report a directed graph associated with the run as a whole
     333                 :             :      to any sinks that support directed graphs.  */
     334                 :             :   void
     335                 :             :   report_global_digraph (const lazily_created<digraphs::digraph> &);
     336                 :             : 
     337                 :             :   enum kind
     338                 :     4645984 :   classify_diagnostic (option_id opt_id,
     339                 :             :                        enum kind new_kind,
     340                 :             :                        location_t where)
     341                 :             :   {
     342                 :     4645984 :     logging::log_function_params
     343                 :     4645984 :       (m_logger, "diagnostics::context::classify_diagnostics")
     344                 :     4645984 :       .log_param_option_id ("option_id", opt_id)
     345                 :     4645984 :       .log_param_kind ("new_kind", new_kind)
     346                 :     4645984 :       .log_param_location_t ("where", where);
     347                 :     4645984 :     logging::auto_inc_depth depth_sentinel (m_logger);
     348                 :             : 
     349                 :     4645984 :     return m_option_classifier.classify_diagnostic (this,
     350                 :             :                                                     opt_id,
     351                 :             :                                                     new_kind,
     352                 :     4645984 :                                                     where);
     353                 :     4645984 :   }
     354                 :             : 
     355                 :     3976735 :   void push_diagnostics (location_t where)
     356                 :             :   {
     357                 :     3976735 :     logging::log_function_params
     358                 :     3976735 :       (m_logger, "diagnostics::context::push_diagnostics")
     359                 :     3976735 :       .log_param_location_t ("where", where);
     360                 :     3976735 :     logging::auto_inc_depth depth_sentinel (m_logger);
     361                 :             : 
     362                 :     3976735 :     m_option_classifier.push ();
     363                 :     3976735 :   }
     364                 :     3976064 :   void pop_diagnostics (location_t where)
     365                 :             :   {
     366                 :     3976064 :     logging::log_function_params
     367                 :     3976064 :       (m_logger, "diagnostics::context::pop_diagnostics")
     368                 :     3976064 :       .log_param_location_t ("where", where);
     369                 :     3976064 :     logging::auto_inc_depth depth_sentinel (m_logger);
     370                 :             : 
     371                 :     3976064 :     m_option_classifier.pop (where);
     372                 :     3976064 :   }
     373                 :             : 
     374                 :             :   void maybe_show_locus (const rich_location &richloc,
     375                 :             :                          const source_printing_options &opts,
     376                 :             :                          enum kind diagnostic_kind,
     377                 :             :                          pretty_printer &pp,
     378                 :             :                          source_effect_info *effect_info);
     379                 :             :   void maybe_show_locus_as_html (const rich_location &richloc,
     380                 :             :                                  const source_printing_options &opts,
     381                 :             :                                  enum kind diagnostic_kind,
     382                 :             :                                  xml::printer &xp,
     383                 :             :                                  source_effect_info *effect_info,
     384                 :             :                                  html_label_writer *label_writer);
     385                 :             : 
     386                 :             :   void emit_diagram (const diagram &diag);
     387                 :             : 
     388                 :             :   /* Various setters for use by option-handling logic.  */
     389                 :             :   void set_sink (std::unique_ptr<sink> sink_);
     390                 :             :   void set_text_art_charset (enum diagnostic_text_art_charset charset);
     391                 :             :   void set_client_data_hooks (std::unique_ptr<client_data_hooks> hooks);
     392                 :             : 
     393                 :             :   void push_owned_urlifier (std::unique_ptr<urlifier>);
     394                 :             :   void push_borrowed_urlifier (const urlifier &);
     395                 :             :   void pop_urlifier ();
     396                 :             : 
     397                 :             :   void initialize_fixits_change_set ();
     398                 :        4406 :   void set_warning_as_error_requested (bool val)
     399                 :             :   {
     400                 :        4406 :     m_warning_as_error_requested = val;
     401                 :        4406 :   }
     402                 :          16 :   void set_report_bug (bool val) { m_report_bug = val; }
     403                 :           4 :   void set_extra_output_kind (enum diagnostics_extra_output_kind kind)
     404                 :             :   {
     405                 :           4 :     m_extra_output_kind = kind;
     406                 :           4 :   }
     407                 :      285689 :   void set_show_cwe (bool val) { m_show_cwe = val;  }
     408                 :      285689 :   void set_show_rules (bool val) { m_show_rules = val; }
     409                 :             :   void set_show_highlight_colors (bool val);
     410                 :      582261 :   void set_path_format (enum diagnostic_path_format val)
     411                 :             :   {
     412                 :      582261 :     m_path_format = val;
     413                 :      296568 :   }
     414                 :      285765 :   void set_show_path_depths (bool val) { m_show_path_depths = val; }
     415                 :      285743 :   void set_show_option_requested (bool val) { m_show_option_requested = val; }
     416                 :             :   void set_show_nesting (bool val);
     417                 :             :   void set_show_nesting_locations (bool val);
     418                 :             :   void set_show_nesting_levels (bool val);
     419                 :          44 :   void set_max_errors (int val) { m_max_errors = val; }
     420                 :         532 :   void set_escape_format (enum diagnostics_escape_format val)
     421                 :             :   {
     422                 :         532 :     m_escape_format = val;
     423                 :           4 :   }
     424                 :             : 
     425                 :             :   void set_format_decoder (printer_fn format_decoder);
     426                 :             :   void set_prefixing_rule (diagnostic_prefixing_rule_t rule);
     427                 :             : 
     428                 :             :   /* Various accessors.  */
     429                 :       30271 :   bool warning_as_error_requested_p () const
     430                 :             :   {
     431                 :       30271 :     return m_warning_as_error_requested;
     432                 :             :   }
     433                 :       15554 :   bool show_path_depths_p () const { return m_show_path_depths; }
     434                 :             :   sink &get_sink (size_t idx) const;
     435                 :        9658 :   enum diagnostic_path_format get_path_format () const { return m_path_format; }
     436                 :       50950 :   enum diagnostics_escape_format get_escape_format () const
     437                 :             :   {
     438                 :       50950 :     return m_escape_format;
     439                 :             :   }
     440                 :             : 
     441                 :             :   file_cache &
     442                 :     2916741 :   get_file_cache () const
     443                 :             :   {
     444                 :     2916741 :     gcc_assert (m_file_cache);
     445                 :     2916741 :     return *m_file_cache;
     446                 :             :   }
     447                 :             : 
     448                 :      283669 :   changes::change_set *get_fixits_change_set () const
     449                 :             :   {
     450                 :      283669 :     return m_fixits_change_set;
     451                 :             :   }
     452                 :        2228 :   const client_data_hooks *get_client_data_hooks () const
     453                 :             :   {
     454                 :        2228 :     return m_client_data_hooks;
     455                 :             :   }
     456                 :             : 
     457                 :             :   const logical_locations::manager *
     458                 :             :   get_logical_location_manager () const;
     459                 :             : 
     460                 :             :   const urlifier *get_urlifier () const;
     461                 :             : 
     462                 :       53803 :   text_art::theme *get_diagram_theme () const { return m_diagrams.m_theme; }
     463                 :             : 
     464                 :      307497 :   int &diagnostic_count (enum kind kind)
     465                 :             :   {
     466                 :      307497 :     return m_diagnostic_counters.m_count_for_kind[static_cast<size_t> (kind)];
     467                 :             :   }
     468                 :     1082524 :   int diagnostic_count (enum kind kind) const
     469                 :             :   {
     470                 :      283966 :     return m_diagnostic_counters.get_count (kind);
     471                 :             :   }
     472                 :             : 
     473                 :             :   /* Option-related member functions.  */
     474                 :    93046852 :   inline bool option_enabled_p (option_id opt_id) const
     475                 :             :   {
     476                 :    93046852 :     if (!m_option_id_mgr)
     477                 :             :       return true;
     478                 :    93046852 :     return m_option_id_mgr->option_enabled_p (opt_id);
     479                 :             :   }
     480                 :             : 
     481                 :     1532369 :   inline char *make_option_name (option_id opt_id,
     482                 :             :                                  enum kind orig_diag_kind,
     483                 :             :                                  enum kind diag_kind) const
     484                 :             :   {
     485                 :     1532369 :     if (!m_option_id_mgr)
     486                 :             :       return nullptr;
     487                 :     1532173 :     return m_option_id_mgr->make_option_name (opt_id,
     488                 :             :                                               orig_diag_kind,
     489                 :     1532173 :                                               diag_kind);
     490                 :             :   }
     491                 :             : 
     492                 :         118 :   inline char *make_option_url (option_id opt_id) const
     493                 :             :   {
     494                 :         118 :     if (!m_option_id_mgr)
     495                 :             :       return nullptr;
     496                 :         118 :     return m_option_id_mgr->make_option_url (opt_id);
     497                 :             :   }
     498                 :             : 
     499                 :             :   void
     500                 :             :   set_option_id_manager (std::unique_ptr<option_id_manager> option_id_mgr,
     501                 :             :                          unsigned lang_mask);
     502                 :             : 
     503                 :      270340 :   unsigned get_lang_mask () const
     504                 :             :   {
     505                 :      270340 :     return m_lang_mask;
     506                 :             :   }
     507                 :             : 
     508                 :             :   bool diagnostic_impl (rich_location *, const metadata *,
     509                 :             :                         option_id, const char *,
     510                 :             :                         va_list *, enum kind) ATTRIBUTE_GCC_DIAG(5,0);
     511                 :             :   bool diagnostic_n_impl (rich_location *, const metadata *,
     512                 :             :                           option_id, unsigned HOST_WIDE_INT,
     513                 :             :                           const char *, const char *, va_list *,
     514                 :             :                           enum kind) ATTRIBUTE_GCC_DIAG(7,0);
     515                 :             : 
     516                 :      369184 :   int get_diagnostic_nesting_level () const
     517                 :             :   {
     518                 :      369184 :     return m_diagnostic_groups.m_diagnostic_nesting_level;
     519                 :             :   }
     520                 :             : 
     521                 :             :   char *build_indent_prefix () const;
     522                 :             : 
     523                 :             :   int
     524                 :         435 :   pch_save (FILE *f)
     525                 :             :   {
     526                 :         435 :     return m_option_classifier.pch_save (f);
     527                 :             :   }
     528                 :             : 
     529                 :             :   int
     530                 :         347 :   pch_restore (FILE *f)
     531                 :             :   {
     532                 :         347 :     return m_option_classifier.pch_restore (f);
     533                 :             :   }
     534                 :             : 
     535                 :             : 
     536                 :             :   void set_diagnostic_buffer (buffer *);
     537                 :     1202358 :   buffer *get_diagnostic_buffer () const
     538                 :             :   {
     539                 :     1202358 :     return m_diagnostic_buffer;
     540                 :             :   }
     541                 :             :   void clear_diagnostic_buffer (buffer &);
     542                 :             :   void flush_diagnostic_buffer (buffer &);
     543                 :             : 
     544                 :     1246717 :   std::unique_ptr<pretty_printer> clone_printer () const
     545                 :             :   {
     546                 :     1246651 :     return m_reference_printer->clone ();
     547                 :             :   }
     548                 :             : 
     549                 :     3643590 :   pretty_printer *get_reference_printer () const
     550                 :             :   {
     551                 :     3641987 :     return m_reference_printer;
     552                 :             :   }
     553                 :             : 
     554                 :             :   void
     555                 :             :   add_sink (std::unique_ptr<sink>);
     556                 :             : 
     557                 :             :   void remove_all_output_sinks ();
     558                 :             : 
     559                 :             :   bool supports_fnotice_on_stderr_p () const;
     560                 :             : 
     561                 :             :   /* Raise SIGABRT on any diagnostic of severity kind::error or higher.  */
     562                 :             :   void
     563                 :          13 :   set_abort_on_error (bool val)
     564                 :             :   {
     565                 :          13 :     m_abort_on_error = val;
     566                 :             :   }
     567                 :             : 
     568                 :             :   /* Accessor for use in serialization, e.g. by C++ modules.  */
     569                 :             :   auto &
     570                 :        2643 :   get_classification_history ()
     571                 :             :   {
     572                 :        7494 :     return m_option_classifier.m_classification_history;
     573                 :             :   }
     574                 :             : 
     575                 :             :   void set_main_input_filename (const char *filename);
     576                 :             : 
     577                 :             :   void
     578                 :      207045 :   set_permissive_option (option_id opt_permissive)
     579                 :             :   {
     580                 :      207045 :     m_opt_permissive = opt_permissive;
     581                 :             :   }
     582                 :             : 
     583                 :             :   void
     584                 :           8 :   set_fatal_errors (bool fatal_errors)
     585                 :             :   {
     586                 :           8 :     m_fatal_errors = fatal_errors;
     587                 :           8 :   }
     588                 :             : 
     589                 :             :   void
     590                 :      285740 :   set_internal_error_callback (void (*cb) (context *,
     591                 :             :                                            const char *,
     592                 :             :                                            va_list *))
     593                 :             :   {
     594                 :      285740 :     m_internal_error = cb;
     595                 :             :   }
     596                 :             : 
     597                 :             :   void
     598                 :       96985 :   set_adjust_diagnostic_info_callback (void (*cb) (const context &,
     599                 :             :                                                    diagnostic_info *))
     600                 :             :   {
     601                 :       96985 :     m_adjust_diagnostic_info = cb;
     602                 :             :   }
     603                 :             : 
     604                 :             :   void
     605                 :         619 :   inhibit_notes () { m_inhibit_notes_p = true; }
     606                 :             : 
     607                 :             :   source_printing_options &
     608                 :      731778 :   get_source_printing_options ()
     609                 :             :   {
     610                 :      731778 :     return m_source_printing;
     611                 :             :   }
     612                 :             :   const source_printing_options &
     613                 :        1570 :   get_source_printing_options () const
     614                 :             :   {
     615                 :        1570 :     return m_source_printing;
     616                 :             :   }
     617                 :             : 
     618                 :         405 :   column_options &get_column_options () { return m_column_options; }
     619                 :     2309736 :   const column_options &get_column_options () const { return m_column_options; }
     620                 :             : 
     621                 :             :   void set_caret_max_width (int value);
     622                 :             : 
     623                 :             : private:
     624                 :             :   void error_recursion () ATTRIBUTE_NORETURN;
     625                 :             : 
     626                 :             :   bool diagnostic_enabled (diagnostic_info *diagnostic);
     627                 :             : 
     628                 :             :   void get_any_inlining_info (diagnostic_info *diagnostic);
     629                 :             : 
     630                 :             :   void check_max_errors (bool flush);
     631                 :             :   void action_after_output (enum kind diag_kind);
     632                 :             : 
     633                 :             :   /* Data members.
     634                 :             :      Ideally, all of these would be private.  */
     635                 :             : 
     636                 :             : private:
     637                 :             :   /* A reference instance of pretty_printer created by the client
     638                 :             :      and owned by the context.  Used for cloning when creating/adding
     639                 :             :      output formats.
     640                 :             :      Owned by the context; this would be a std::unique_ptr if
     641                 :             :      context had a proper ctor.  */
     642                 :             :   pretty_printer *m_reference_printer;
     643                 :             : 
     644                 :             :   /* Cache of source code.
     645                 :             :      Owned by the context; this would be a std::unique_ptr if
     646                 :             :      context had a proper ctor.  */
     647                 :             :   file_cache *m_file_cache;
     648                 :             : 
     649                 :             :   /* The number of times we have issued diagnostics.  */
     650                 :             :   counters m_diagnostic_counters;
     651                 :             : 
     652                 :             :   /* True if it has been requested that warnings be treated as errors.  */
     653                 :             :   bool m_warning_as_error_requested;
     654                 :             : 
     655                 :             :   /* The number of option indexes that can be passed to warning() et
     656                 :             :      al.  */
     657                 :             :   int m_n_opts;
     658                 :             : 
     659                 :             :   /* The stack of sets of overridden diagnostic option severities.  */
     660                 :             :   option_classifier m_option_classifier;
     661                 :             : 
     662                 :             :   /* True if we should print any CWE identifiers associated with
     663                 :             :      diagnostics.  */
     664                 :             :   bool m_show_cwe;
     665                 :             : 
     666                 :             :   /* True if we should print any rules associated with diagnostics.  */
     667                 :             :   bool m_show_rules;
     668                 :             : 
     669                 :             :   /* How should diagnostics::paths::path objects be printed.  */
     670                 :             :   enum diagnostic_path_format m_path_format;
     671                 :             : 
     672                 :             :   /* True if we should print stack depths when printing diagnostic paths.  */
     673                 :             :   bool m_show_path_depths;
     674                 :             : 
     675                 :             :   /* True if we should print the command line option which controls
     676                 :             :      each diagnostic, if known.  */
     677                 :             :   bool m_show_option_requested;
     678                 :             : 
     679                 :             :   /* True if we should raise a SIGABRT on errors.  */
     680                 :             :   bool m_abort_on_error;
     681                 :             : 
     682                 :             : public:
     683                 :             :   /* True if we should show the column number on diagnostics.  */
     684                 :             :   bool m_show_column;
     685                 :             : 
     686                 :             :   /* True if pedwarns are errors.  */
     687                 :             :   bool m_pedantic_errors;
     688                 :             : 
     689                 :             :   /* True if permerrors are warnings.  */
     690                 :             :   bool m_permissive;
     691                 :             : 
     692                 :             : private:
     693                 :             :   /* The option to associate with turning permerrors into warnings,
     694                 :             :      if any.  */
     695                 :             :   option_id m_opt_permissive;
     696                 :             : 
     697                 :             :   /* True if errors are fatal.  */
     698                 :             :   bool m_fatal_errors;
     699                 :             : 
     700                 :             : public:
     701                 :             :   /* True if all warnings should be disabled.  */
     702                 :             :   bool m_inhibit_warnings;
     703                 :             : 
     704                 :             :   /* True if warnings should be given in system headers.  */
     705                 :             :   bool m_warn_system_headers;
     706                 :             : 
     707                 :             : private:
     708                 :             :   /* Maximum number of errors to report.  */
     709                 :             :   int m_max_errors;
     710                 :             : 
     711                 :             :   /* Client-supplied callbacks for use in text output.  */
     712                 :             :   struct {
     713                 :             :     /* This function is called before any message is printed out.  It is
     714                 :             :        responsible for preparing message prefix and such.  For example, it
     715                 :             :        might say:
     716                 :             :        In file included from "/usr/local/include/curses.h:5:
     717                 :             :        from "/home/gdr/src/nifty_printer.h:56:
     718                 :             :        ...
     719                 :             :     */
     720                 :             :     text_starter_fn m_begin_diagnostic;
     721                 :             : 
     722                 :             :     /* This function is called by diagnostic_show_locus in between
     723                 :             :        disjoint spans of source code, so that the context can print
     724                 :             :        something to indicate that a new span of source code has begun.  */
     725                 :             :     start_span_fn<to_text> m_text_start_span;
     726                 :             :     start_span_fn<to_html> m_html_start_span;
     727                 :             : 
     728                 :             :     /* This function is called after the diagnostic message is printed.  */
     729                 :             :     text_finalizer_fn m_end_diagnostic;
     730                 :             :   } m_text_callbacks;
     731                 :             : 
     732                 :             :   /* Client hook to report an internal error.  */
     733                 :             :   void (*m_internal_error) (context *, const char *, va_list *);
     734                 :             : 
     735                 :             :   /* Client hook to adjust properties of the given diagnostic that we're
     736                 :             :      about to issue, such as its kind.  */
     737                 :             :   void (*m_adjust_diagnostic_info)(const context &, diagnostic_info *);
     738                 :             : 
     739                 :             :   /* Owned by the context; this would be a std::unique_ptr if
     740                 :             :      context had a proper ctor.  */
     741                 :             :   option_id_manager *m_option_id_mgr;
     742                 :             :   unsigned m_lang_mask;
     743                 :             : 
     744                 :             :   /* A stack of optional hooks for adding URLs to quoted text strings in
     745                 :             :      diagnostics.  Only used for the main diagnostic message.
     746                 :             :      Typically a single one owner by the context, but can be temporarily
     747                 :             :      overridden by a borrowed urlifier (e.g. on-stack).  */
     748                 :             :   struct urlifier_stack_node
     749                 :             :   {
     750                 :             :     urlifier *m_urlifier;
     751                 :             :     bool m_owned;
     752                 :             :   };
     753                 :             :   auto_vec<urlifier_stack_node> *m_urlifier_stack;
     754                 :             : 
     755                 :             : public:
     756                 :             :   /* Auxiliary data for client.  */
     757                 :             :   void *m_client_aux_data;
     758                 :             : 
     759                 :             :   /* Used to detect that the last caret was printed at the same location.  */
     760                 :             :   location_t m_last_location;
     761                 :             : 
     762                 :             : private:
     763                 :             :   int m_lock;
     764                 :             : 
     765                 :             :   bool m_inhibit_notes_p;
     766                 :             : 
     767                 :             :   source_printing_options m_source_printing;
     768                 :             :   column_options m_column_options;
     769                 :             : 
     770                 :             :   /* True if -freport-bug option is used.  */
     771                 :             :   bool m_report_bug;
     772                 :             : 
     773                 :             :   /* Used to specify additional diagnostic output to be emitted after the
     774                 :             :      rest of the diagnostic.  This is for implementing
     775                 :             :      -fdiagnostics-parseable-fixits and GCC_EXTRA_DIAGNOSTIC_OUTPUT.  */
     776                 :             :   enum diagnostics_extra_output_kind m_extra_output_kind;
     777                 :             : 
     778                 :             :   /* How should non-ASCII/non-printable bytes be escaped when
     779                 :             :      a diagnostic suggests escaping the source code on output.  */
     780                 :             :   enum diagnostics_escape_format m_escape_format;
     781                 :             : 
     782                 :             :   /* If non-NULL, a diagnostics::changes::change_set to which fix-it hints
     783                 :             :      should be applied, for generating patches.
     784                 :             :      Owned by the context; this would be a std::unique_ptr if
     785                 :             :      context had a proper ctor.  */
     786                 :             :   changes::change_set *m_fixits_change_set;
     787                 :             : 
     788                 :             :   /* Fields relating to diagnostic groups.  */
     789                 :             :   struct {
     790                 :             :     /* How many diagnostic_group instances are currently alive.  */
     791                 :             :     int m_group_nesting_depth;
     792                 :             : 
     793                 :             :     /* How many nesting levels have been pushed within this group.  */
     794                 :             :     int m_diagnostic_nesting_level;
     795                 :             : 
     796                 :             :     /* How many diagnostics have been emitted since the bottommost
     797                 :             :        diagnostic_group was pushed.  */
     798                 :             :     int m_emission_count;
     799                 :             : 
     800                 :             :     /* The "group+diagnostic" nesting depth from which to inhibit notes.  */
     801                 :             :     int m_inhibiting_notes_from;
     802                 :             :   } m_diagnostic_groups;
     803                 :             : 
     804                 :             :   void inhibit_notes_in_group (bool inhibit = true);
     805                 :             :   bool notes_inhibited_in_group () const;
     806                 :             : 
     807                 :             :   /* The various sinks to which diagnostics are to be outputted
     808                 :             :      (text vs structured formats such as SARIF).
     809                 :             :      The sinks are owned by the context; this would be a
     810                 :             :      std::vector<std::unique_ptr> if context had a
     811                 :             :      proper ctor.  */
     812                 :             :   auto_vec<sink *> m_sinks;
     813                 :             : 
     814                 :             :   /* Callback to set the locations of call sites along the inlining
     815                 :             :      stack corresponding to a diagnostic location.  Needed to traverse
     816                 :             :      the BLOCK_SUPERCONTEXT() chain hanging off the LOCATION_BLOCK()
     817                 :             :      of a diagnostic's location.  */
     818                 :             :   set_locations_callback_t m_set_locations_cb;
     819                 :             : 
     820                 :             :   /* A bundle of hooks for providing data to the context about its client
     821                 :             :      e.g. version information, plugins, etc.
     822                 :             :      Used by SARIF output to give metadata about the client that's
     823                 :             :      producing diagnostics.
     824                 :             :      Owned by the context; this would be a std::unique_ptr if
     825                 :             :      context had a proper ctor.  */
     826                 :             :   client_data_hooks *m_client_data_hooks;
     827                 :             : 
     828                 :             :   /* Support for diagrams.  */
     829                 :             :   struct
     830                 :             :   {
     831                 :             :     /* Theme to use when generating diagrams.
     832                 :             :        Can be NULL (if text art is disabled).
     833                 :             :        Owned by the context; this would be a std::unique_ptr if
     834                 :             :        context had a proper ctor.  */
     835                 :             :     text_art::theme *m_theme;
     836                 :             : 
     837                 :             :   } m_diagrams;
     838                 :             : 
     839                 :             :   /* Owned by the context.  */
     840                 :             :   char **m_original_argv;
     841                 :             : 
     842                 :             :   /* Borrowed pointer to the active diagnostics::buffer, if any.
     843                 :             :      If null (the default), then diagnostics that are reported to the
     844                 :             :      context are immediately issued to the output format.
     845                 :             :      If non-null, then diagnostics that are reported to the context
     846                 :             :      are buffered in the buffer, and may be issued to the output format
     847                 :             :      later (if the buffer is flushed), moved to other buffers, or
     848                 :             :      discarded (if the buffer is cleared).  */
     849                 :             :   buffer *m_diagnostic_buffer;
     850                 :             : 
     851                 :             :   /* Owned by the context.
     852                 :             :      Debugging option: if non-NULL, report information to the logger
     853                 :             :      on what the context is doing.  */
     854                 :             :   logging::logger *m_logger;
     855                 :             : };
     856                 :             : 
     857                 :             : /* Client supplied function to announce a diagnostic
     858                 :             :    (for text-based diagnostic output).  */
     859                 :             : inline text_starter_fn &
     860                 :             : text_starter (context *dc)
     861                 :             : {
     862                 :             :   return dc->m_text_callbacks.m_begin_diagnostic;
     863                 :             : }
     864                 :             : 
     865                 :             : /* Client supplied function called between disjoint spans of source code,
     866                 :             :    so that the context can print
     867                 :             :    something to indicate that a new span of source code has begun.  */
     868                 :             : inline start_span_fn<to_text> &
     869                 :       18809 : start_span (context *dc)
     870                 :             : {
     871                 :       18809 :   return dc->m_text_callbacks.m_text_start_span;
     872                 :             : }
     873                 :             : 
     874                 :             : /* Client supplied function called after a diagnostic message is
     875                 :             :    displayed (for text-based diagnostic output).  */
     876                 :             : inline text_finalizer_fn &
     877                 :             : text_finalizer (context *dc)
     878                 :             : {
     879                 :             :   return dc->m_text_callbacks.m_end_diagnostic;
     880                 :             : }
     881                 :             : 
     882                 :             : } // namespace diagnostics
     883                 :             : 
     884                 :             : #endif /* ! GCC_DIAGNOSTICS_CONTEXT_H */
        

Generated by: LCOV version 2.1-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.