This patch simplifies diagnostic_report_diagnostic by moving the pragma-handling logic into a subroutine.
No functional change intended. Successfully bootstrapped®rtested on x86_64-pc-linux-gnu. Committed to trunk as r247660 gcc/ChangeLog: * diagnostic.c (diagnostic_report_diagnostic): Split out pragma handling logic into... (update_effective_level_from_pragmas): ...this new function. --- gcc/diagnostic.c | 79 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 29 deletions(-) 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. */ -- 1.8.5.3