* [committed] diagnostic_report_diagnostic: refactor pragma-handling
@ 2017-05-05 20:53 David Malcolm
0 siblings, 0 replies; only message in thread
From: David Malcolm @ 2017-05-05 20:53 UTC (permalink / raw)
To: gcc-patches; +Cc: David Malcolm
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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2017-05-05 20:53 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-05 20:53 [committed] diagnostic_report_diagnostic: refactor pragma-handling David Malcolm
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).