+2016-10-14 Nathan Sidwell <nathan@acm.org>
+
+ * diagnostic.c (diagnostic_action_after_output): Remove fatal
+ and max error handling here ....
+ (diagnostic_report_diagnostic): ... do it here instead.
+
2016-10-14 David Malcolm <dmalcolm@redhat.com>
* print-rtl-function.c (print_edge): Omit "(flags)" when none are
diagnostic_finish (context);
exit (FATAL_EXIT_CODE);
}
- if (context->max_errors != 0
- && ((unsigned) (diagnostic_kind_count (context, DK_ERROR)
- + diagnostic_kind_count (context, DK_SORRY)
- + diagnostic_kind_count (context, DK_WERROR))
- >= context->max_errors))
- {
- fnotice (stderr,
- "compilation terminated due to -fmax-errors=%u.\n",
- context->max_errors);
- diagnostic_finish (context);
- exit (FATAL_EXIT_CODE);
- }
+ /* -fmax-error handling is just before the next diagnostic is
+ emitted. */
break;
case DK_ICE:
-Wno-error=*. */
if (context->warning_as_error_requested
&& diagnostic->kind == DK_WARNING)
- {
- diagnostic->kind = DK_ERROR;
- }
+ diagnostic->kind = DK_ERROR;
if (diagnostic->option_index
&& diagnostic->option_index != permissive_error_option (context))
return false;
}
+ if (diagnostic->kind != DK_NOTE && context->max_errors)
+ {
+ /* Check, before emitting the diagnostic, whether we would
+ exceed the limit. This way we will emit notes relevant to
+ the final emitted error. */
+ int count = (diagnostic_kind_count (context, DK_ERROR)
+ + diagnostic_kind_count (context, DK_SORRY)
+ + diagnostic_kind_count (context, DK_WERROR));
+
+ if ((unsigned) count >= context->max_errors)
+ {
+ fnotice (stderr,
+ "compilation terminated due to -fmax-errors=%u.\n",
+ context->max_errors);
+ diagnostic_finish (context);
+ exit (FATAL_EXIT_CODE);
+ }
+ }
+
context->lock++;
if (diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
/* PR c/44782 */
/* { dg-do compile } */
-/* { dg-options "-fmax-errors=3" } */
+/* { dg-options "-fmax-errors=3 -Wall" } */
void foo (unsigned int i, unsigned int j)
{
(i) (); /* { dg-error "" } */
(j) (); /* { dg-error "" } */
- (i+j) (); /* { dg-error "" } */
+
+ i + j; /* { dg-warning "" } */
+
+ (k) (); /* { dg-error "" } */
+ /* Make sure we see the notes related to the final error we emit. */
+ /* { dg-message "identifier" "" { target c } 12 } */
+
+ /* Warnings after the final error should not appear. */
+ i + j; /* no warning. */
+
(i*j) (); /* no error here due to -fmax-errors */
+
} /* { dg-prune-output "compilation terminated" } */