diff options
Diffstat (limited to 'gcc/diagnostics/option-classifier.h')
-rw-r--r-- | gcc/diagnostics/option-classifier.h | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/gcc/diagnostics/option-classifier.h b/gcc/diagnostics/option-classifier.h new file mode 100644 index 0000000..3b16c74 --- /dev/null +++ b/gcc/diagnostics/option-classifier.h @@ -0,0 +1,110 @@ +/* Stacks of set of classifications of diagnostics. + Copyright (C) 2000-2025 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_DIAGNOSTICS_OPTION_CLASSIFIER_H +#define GCC_DIAGNOSTICS_OPTION_CLASSIFIER_H + +namespace diagnostics { + +/* Forward declarations. */ +class context; + +/* A stack of sets of classifications: each entry in the stack is + a mapping from option index to diagnostic severity that can be changed + via pragmas. The stack can be pushed and popped. */ + +class option_classifier +{ +public: + void init (int n_opts); + void fini (); + + /* Save all diagnostic classifications in a stack. */ + void push (); + + /* Restore the topmost classification set off the stack. If the stack + is empty, revert to the state based on command line parameters. */ + void pop (location_t where); + + bool option_unspecified_p (option_id opt_id) const + { + return get_current_override (opt_id) == kind::unspecified; + } + + enum kind get_current_override (option_id opt_id) const + { + gcc_assert (opt_id.m_idx < m_n_opts); + return m_classify_diagnostic[opt_id.m_idx]; + } + + enum kind + classify_diagnostic (const context *context, + option_id opt_id, + enum kind new_kind, + location_t where); + + enum kind + update_effective_level_from_pragmas (diagnostic_info *diagnostic) const; + + int pch_save (FILE *); + int pch_restore (FILE *); + +private: + /* Each time a diagnostic's classification is changed with a pragma, + we record the change and the location of the change in an array of + these structs. */ + struct classification_change_t + { + location_t location; + + /* For kind::pop, this is the index of the corresponding push (as stored + in m_push_list). + Otherwise, this is an option index. */ + int option; + + enum kind kind; + }; + + int m_n_opts; + + /* For each option index that can be passed to warning() et al + (OPT_* from options.h when using this code with the core GCC + options), this array may contain a new kind that the diagnostic + should be changed to before reporting, or kind::unspecified to leave + it as the reported kind, or kind::ignored to not report it at + all. */ + enum kind *m_classify_diagnostic; + + /* History of all changes to the classifications above. This list + is stored in location-order, so we can search it, either + binary-wise or end-to-front, to find the most recent + classification for a given diagnostic, given the location of the + diagnostic. */ + vec<classification_change_t> m_classification_history; + + /* For context::get_classification_history, declared later. */ + friend class context; + + /* For pragma push/pop. */ + vec<int> m_push_list; +}; + +} // namespace diagnostics + +#endif /* ! GCC_DIAGNOSTICS_OPTION_CLASSIFIER_H */ |