diff options
author | David Malcolm <dmalcolm@redhat.com> | 2017-05-05 20:51:18 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2017-05-05 20:51:18 +0000 |
commit | dc41c9b07d3da5456df2fd11ed89be084afa55ed (patch) | |
tree | 1d806129b966e092e1dc6fa4b30cee8efe4a152d /gcc | |
parent | 822856928407e34bc10f2aa7d00bc6149b43d7f8 (diff) | |
download | gcc-dc41c9b07d3da5456df2fd11ed89be084afa55ed.zip gcc-dc41c9b07d3da5456df2fd11ed89be084afa55ed.tar.gz gcc-dc41c9b07d3da5456df2fd11ed89be084afa55ed.tar.bz2 |
diagnostic_report_diagnostic: refactor pragma-handling
This patch simplifies diagnostic_report_diagnostic by moving the
pragma-handling logic into a subroutine.
No functional change intended.
gcc/ChangeLog:
* diagnostic.c (diagnostic_report_diagnostic): Split out pragma
handling logic into...
(update_effective_level_from_pragmas): ...this new function.
From-SVN: r247660
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/diagnostic.c | 79 |
2 files changed, 56 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e0e6ad..a6fc221 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-05-05 David Malcolm <dmalcolm@redhat.com> + + * diagnostic.c (diagnostic_report_diagnostic): Split out pragma + handling logic into... + (update_effective_level_from_pragmas): ...this new function. + 2017-05-04 Andrew Waterman <andrew@sifive.com> * config/riscv/riscv.opt (mstrict-align): New option. diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index dc81755..b61c09e 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -768,6 +768,54 @@ print_parseable_fixits (pretty_printer *pp, rich_location *richloc) } } +/* Update the diag_class of DIAGNOSTIC based on its location + relative to any + #pragma GCC diagnostic + directives recorded within CONTEXT. + + Return the new diag_class of DIAGNOSTIC if it was updated, or + DK_UNSPECIFIED otherwise. */ + +static diagnostic_t +update_effective_level_from_pragmas (diagnostic_context *context, + diagnostic_info *diagnostic) +{ + diagnostic_t diag_class = DK_UNSPECIFIED; + + if (context->n_classification_history > 0) + { + location_t location = diagnostic_location (diagnostic); + + /* FIXME: Stupid search. Optimize later. */ + for (int i = context->n_classification_history - 1; i >= 0; i --) + { + if (linemap_location_before_p + (line_table, + context->classification_history[i].location, + location)) + { + if (context->classification_history[i].kind == (int) DK_POP) + { + i = context->classification_history[i].option; + continue; + } + int option = context->classification_history[i].option; + /* The option 0 is for all the diagnostics. */ + if (option == 0 || option == diagnostic->option_index) + { + diag_class = context->classification_history[i].kind; + if (diag_class != DK_UNSPECIFIED) + diagnostic->kind = diag_class; + break; + } + } + } + } + + return diag_class; +} + + /* Report a diagnostic message (an error or a warning) as specified by DC. This function is *the* subroutine in terms of which front-ends should implement their specific diagnostic handling modules. The @@ -822,8 +870,6 @@ diagnostic_report_diagnostic (diagnostic_context *context, if (diagnostic->option_index && diagnostic->option_index != permissive_error_option (context)) { - diagnostic_t diag_class = DK_UNSPECIFIED; - /* This tests if the user provided the appropriate -Wfoo or -Wno-foo option. */ if (! context->option_enabled (diagnostic->option_index, @@ -831,33 +877,8 @@ diagnostic_report_diagnostic (diagnostic_context *context, return false; /* This tests for #pragma diagnostic changes. */ - if (context->n_classification_history > 0) - { - /* FIXME: Stupid search. Optimize later. */ - for (int i = context->n_classification_history - 1; i >= 0; i --) - { - if (linemap_location_before_p - (line_table, - context->classification_history[i].location, - location)) - { - if (context->classification_history[i].kind == (int) DK_POP) - { - i = context->classification_history[i].option; - continue; - } - int option = context->classification_history[i].option; - /* The option 0 is for all the diagnostics. */ - if (option == 0 || option == diagnostic->option_index) - { - diag_class = context->classification_history[i].kind; - if (diag_class != DK_UNSPECIFIED) - diagnostic->kind = diag_class; - break; - } - } - } - } + diagnostic_t diag_class + = update_effective_level_from_pragmas (context, diagnostic); /* This tests if the user provided the appropriate -Werror=foo option. */ |