+2016-01-26 David Malcolm <dmalcolm@redhat.com>
+
+ PR other/69006
+ * diagnostic-show-locus.c (layout::print_source_line): Replace
+ call to pp_newline with call to layout::print_newline.
+ (layout::print_annotation_line): Likewise.
+ (layout::move_to_column): Likewise.
+ (layout::print_any_fixits): After printing any fixits, print a
+ trailing newline, if necessary.
+ (layout::print_newline): New method, resetting any colorization
+ before a newline.
+ (diagnostic_show_locus): Move the pp_newline to before the
+ early bailout. Remove dummy block enclosing the layout instance.
+ * diagnostic.c (default_diagnostic_finalizer): Replace invocation
+ of pp_newline_and_flush with pp_flush.
+ (diagnostic_append_note): Delete use of pp_newline.
+ (diagnostic_append_note_at_rich_loc): Delete.
+ * diagnostic.h (diagnostic_append_note_at_rich_loc): Delete.
+ * pretty-print.h (output_buffer_append_r): Reset buff->line_length
+ when newline characters are added to the buffer.
+
2016-01-26 Michael Matz <matz@suse.de>
* configure.ac (ac_cv_std_swap_in_utility): New test.
+2016-01-26 David Malcolm <dmalcolm@redhat.com>
+
+ PR other/69006
+ * c-opts.c (c_diagnostic_finalizer): Replace invocation of
+ pp_newline_and_flush with pp_flush.
+
2016-01-20 Martin Sebor <msebor@redhat.com>
PR c/69405
finalizer -- for tokens resulting from macro expansion. */
virt_loc_aware_diagnostic_finalizer (context, diagnostic);
pp_destroy_prefix (context->printer);
- pp_newline_and_flush (context->printer);
+ pp_flush (context->printer);
}
/* Common default settings for diagnostics. */
+2016-01-26 David Malcolm <dmalcolm@redhat.com>
+
+ PR other/69006
+ * error.c (print_instantiation_partial_context_line): Add missing
+ newlines from output for the t == NULL case.
+ (print_instantiation_partial_context): Remove call to pp_newline.
+
2016-01-24 Patrick Palka <ppalka@gcc.gnu.org>
Revert:
{
pp_verbatim (context->printer,
recursive_p
- ? _("recursively required from here")
- : _("required from here"));
+ ? _("recursively required from here\n")
+ : _("required from here\n"));
}
}
}
print_instantiation_partial_context_line (context, NULL, loc,
/*recursive_p=*/false);
- pp_newline (context->printer);
}
/* Called from cp_thing to print the template context for an error. */
void print_any_fixits (int row, const rich_location *richloc);
private:
+ void print_newline ();
+
bool
get_state_at_point (/* Inputs. */
int row, int column,
pp_character (m_pp, c);
line++;
}
- pp_newline (m_pp);
+ print_newline ();
lbounds_out->m_first_non_ws = first_non_ws;
lbounds_out->m_last_non_ws = last_non_ws;
pp_character (m_pp, ' ');
}
}
- pp_newline (m_pp);
+ print_newline ();
}
/* If there are any fixit hints on source line ROW within RICHLOC, print them.
}
}
}
+
+ /* Add a trailing newline, if necessary. */
+ move_to_column (&column, 0);
+}
+
+/* Disable any colorization and emit a newline. */
+
+void
+layout::print_newline ()
+{
+ m_colorizer.set_normal_text ();
+ pp_newline (m_pp);
}
/* Return true if (ROW/COLUMN) is within a range of the layout.
/* Start a new line if we need to. */
if (*column > dest_column)
{
- pp_newline (m_pp);
+ print_newline ();
*column = 0;
}
diagnostic_show_locus (diagnostic_context * context,
const diagnostic_info *diagnostic)
{
+ pp_newline (context->printer);
+
if (!context->show_caret
|| diagnostic_location (diagnostic, 0) <= BUILTINS_LOCATION
|| diagnostic_location (diagnostic, 0) == context->last_location)
context->last_location = diagnostic_location (diagnostic, 0);
- pp_newline (context->printer);
-
const char *saved_prefix = pp_get_prefix (context->printer);
pp_set_prefix (context->printer, NULL);
- {
- layout layout (context, diagnostic);
- int last_line = layout.get_last_line ();
- for (int row = layout.get_first_line ();
- row <= last_line;
- row++)
- {
- /* Print the source line, followed by an annotation line
- consisting of any caret/underlines, then any fixits.
- If the source line can't be read, print nothing. */
- line_bounds lbounds;
- if (layout.print_source_line (row, &lbounds))
- {
- layout.print_annotation_line (row, lbounds);
- layout.print_any_fixits (row, diagnostic->richloc);
- }
- }
-
- /* The closing scope here leads to the dtor for layout and thus
- colorizer being called here, which affects the precise
- place where colorization is turned off in the unittest
- for colorized output. */
- }
+ layout layout (context, diagnostic);
+ int last_line = layout.get_last_line ();
+ for (int row = layout.get_first_line (); row <= last_line; row++)
+ {
+ /* Print the source line, followed by an annotation line
+ consisting of any caret/underlines, then any fixits.
+ If the source line can't be read, print nothing. */
+ line_bounds lbounds;
+ if (layout.print_source_line (row, &lbounds))
+ {
+ layout.print_annotation_line (row, lbounds);
+ layout.print_any_fixits (row, diagnostic->richloc);
+ }
+ }
pp_set_prefix (context->printer, saved_prefix);
}
{
diagnostic_show_locus (context, diagnostic);
pp_destroy_prefix (context->printer);
- pp_newline_and_flush (context->printer);
+ pp_flush (context->printer);
}
/* Interface to specify diagnostic kind overrides. Returns the
saved_prefix = pp_get_prefix (context->printer);
pp_set_prefix (context->printer,
diagnostic_build_prefix (context, &diagnostic));
- pp_newline (context->printer);
- pp_format (context->printer, &diagnostic.message);
- pp_output_formatted_text (context->printer);
- pp_destroy_prefix (context->printer);
- pp_set_prefix (context->printer, saved_prefix);
- diagnostic_show_locus (context, &diagnostic);
- va_end (ap);
-}
-
-/* Same as diagnostic_append_note, but at RICHLOC. */
-
-void
-diagnostic_append_note_at_rich_loc (diagnostic_context *context,
- rich_location *richloc,
- const char * gmsgid, ...)
-{
- diagnostic_info diagnostic;
- va_list ap;
- const char *saved_prefix;
-
- va_start (ap, gmsgid);
- diagnostic_set_info (&diagnostic, gmsgid, &ap, richloc, DK_NOTE);
- if (context->inhibit_notes_p)
- {
- va_end (ap);
- return;
- }
- saved_prefix = pp_get_prefix (context->printer);
- pp_set_prefix (context->printer,
- diagnostic_build_prefix (context, &diagnostic));
- pp_newline (context->printer);
pp_format (context->printer, &diagnostic.message);
pp_output_formatted_text (context->printer);
pp_destroy_prefix (context->printer);
ATTRIBUTE_GCC_DIAG(2,0);
extern void diagnostic_append_note (diagnostic_context *, location_t,
const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
-extern void diagnostic_append_note_at_rich_loc (diagnostic_context *,
- rich_location *,
- const char *, ...)
- ATTRIBUTE_GCC_DIAG(3,4);
#endif
extern char *diagnostic_build_prefix (diagnostic_context *, const diagnostic_info *);
void default_diagnostic_starter (diagnostic_context *, diagnostic_info *);
+2016-01-26 David Malcolm <dmalcolm@redhat.com>
+
+ PR other/69006
+ * error.c (gfc_diagnostic_starter): Delete use of pp_newline.
+
2016-01-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/69397
/* Fortran uses an empty line between locus and caret line. */
pp_newline (context->printer);
diagnostic_show_locus (context, diagnostic);
- pp_newline (context->printer);
/* If the caret line was shown, the prefix does not contain the
locus. */
pp_set_prefix (context->printer, kind_prefix);
{
gcc_checking_assert (start);
obstack_grow (buff->obstack, start, length);
- buff->line_length += length;
+ for (int i = 0; i < length; i++)
+ if (start[i] == '\n')
+ buff->line_length = 0;
+ else
+ buff->line_length++;
}
/* Return a pointer to the last character emitted in the
+2016-01-26 David Malcolm <dmalcolm@redhat.com>
+
+ PR other/69006
+ * g++.dg/ext/timevar1.C: Add dg-allow-blank-lines-in-output
+ directive.
+ * gcc.dg/plugin/diagnostic-test-show-locus-color.c: Update
+ expected multiline output to reflect the colorization being
+ disabled before newlines.
+ * gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
+ (custom_diagnostic_finalizer): Replace call to
+ pp_newline_and_flush with call to pp_flush.
+ * gcc.dg/unroll-2.c: Add dg-allow-blank-lines-in-output directive.
+ * gfortran.dg/implicit_class_1.f90: Likewise.
+ * lib/gcc-dg.exp (allow_blank_lines): New global.
+ (dg-allow-blank-lines-in-output): New procedure.
+ (gcc-dg-prune): Complain about blank lines in the output, unless
+ dg-allow-blank-lines-in-output was called.
+ * lib/multiline.exp (_build_multiline_regex): Only support
+ arbitrary followup text for non-blank-lines, not for blank lines.
+
2016-01-26 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/69483
// PR c++/52248
// { dg-options "-ftime-report" }
+// { dg-allow-blank-lines-in-output 1 }
// { dg-prune-output "wall" }
// { dg-prune-output "times" }
// { dg-prune-output "TOTAL" }
/* { dg-begin-multiline-output "" }
myvar = \e[32m\e[Kmyvar\e[m\e[K\e[01;35m\e[K.\e[m\e[K\e[34m\e[Kx\e[m\e[K;
- \e[32m\e[K~~~~~\e[m\e[K\e[01;35m\e[K^\e[m\e[K\e[34m\e[K~
-\e[m\e[K
+ \e[32m\e[K~~~~~\e[m\e[K\e[01;35m\e[K^\e[m\e[K\e[34m\e[K~\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
/* { dg-begin-multiline-output "" }
x = \e[32m\e[Kfirst_function ()\e[m\e[K \e[01;35m\e[K+\e[m\e[K \e[34m\e[Ksecond_function ()\e[m\e[K;
- \e[32m\e[K~~~~~~~~~~~~~~~~~\e[m\e[K \e[01;35m\e[K^\e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~
-\e[m\e[K
+ \e[32m\e[K~~~~~~~~~~~~~~~~~\e[m\e[K \e[01;35m\e[K^\e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
+ second_function ()); /* { dg-warning "test" } */
/* { dg-begin-multiline-output "" }
- x = (\e[32m\e[Kfirst_function ()
- \e[m\e[K \e[32m\e[K~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[01;35m\e[K+\e[m\e[K \e[34m\e[Ksecond_function ()\e[m\e[K);
- \e[01;35m\e[K^\e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~
-\e[m\e[K
+ x = (\e[32m\e[Kfirst_function ()\e[m\e[K
+ \e[32m\e[K~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[01;35m\e[K+\e[m\e[K \e[34m\e[Ksecond_function ()\e[m\e[K);
+ \e[01;35m\e[K^\e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
magna, aliqua));
/* { dg-begin-multiline-output "" }
- x = (\e[32m\e[Kfirst_function_with_a_very_long_name (lorem, ipsum, dolor, sit, amet,
- \e[m\e[K \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[32m\e[K consectetur, adipiscing, elit,
- \e[m\e[K \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[32m\e[K sed, eiusmod, tempor,
- \e[m\e[K \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[32m\e[K incididunt, ut, labore, et,
- \e[m\e[K \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[32m\e[K dolore, magna, aliqua)
- \e[m\e[K \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[01;35m\e[K+\e[m\e[K \e[34m\e[Ksecond_function_with_a_very_long_name (lorem, ipsum, dolor, sit,
- \e[m\e[K \e[01;35m\e[K^\e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[34m\e[K amet, consectetur,
- \e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[34m\e[K adipiscing, elit, sed,
- \e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[34m\e[K eiusmod, tempor, incididunt,
- \e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[34m\e[K ut, labore, et, dolore,
- \e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~~~~~~
-\e[m\e[K \e[34m\e[K magna, aliqua)\e[m\e[K);
- \e[34m\e[K~~~~~~~~~~~~~~
-\e[m\e[K
+ x = (\e[32m\e[Kfirst_function_with_a_very_long_name (lorem, ipsum, dolor, sit, amet,\e[m\e[K
+ \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[32m\e[K consectetur, adipiscing, elit,\e[m\e[K
+ \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[32m\e[K sed, eiusmod, tempor,\e[m\e[K
+ \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[32m\e[K incididunt, ut, labore, et,\e[m\e[K
+ \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[32m\e[K dolore, magna, aliqua)\e[m\e[K
+ \e[32m\e[K~~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[01;35m\e[K+\e[m\e[K \e[34m\e[Ksecond_function_with_a_very_long_name (lorem, ipsum, dolor, sit,
+ \e[01;35m\e[K^\e[m\e[K \e[34m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[34m\e[K amet, consectetur,\e[m\e[K
+ \e[34m\e[K~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[34m\e[K adipiscing, elit, sed,\e[m\e[K
+ \e[34m\e[K~~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[34m\e[K eiusmod, tempor, incididunt,\e[m\e[K
+ \e[34m\e[K~~~~~~~~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[34m\e[K ut, labore, et, dolore,\e[m\e[K
+ \e[34m\e[K~~~~~~~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[34m\e[K magna, aliqua)\e[m\e[K);
+ \e[34m\e[K~~~~~~~~~~~~~~\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
float f = 98.6f; /* { dg-warning "test" } */
/* { dg-begin-multiline-output "" }
float f = \e[01;35m\e[K98.6f\e[m\e[K;
- \e[01;35m\e[K^~~~~
-\e[m\e[K
+ \e[01;35m\e[K^~~~~\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
float f = foo * bar; /* { dg-warning "17: test" } */
/* { dg-begin-multiline-output "" }
float f = \e[01;35m\e[Kfoo * bar\e[m\e[K;
- \e[01;35m\e[K~~~~^~~~~
-\e[m\e[K
+ \e[01;35m\e[K~~~~^~~~~\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
float f = foo * bar; /* { dg-warning "95: test" } */
/* { dg-begin-multiline-output "" }
float f = \e[01;35m\e[Kfoo * bar\e[m\e[K;
- \e[01;35m\e[K~~~~^~~~~
-\e[m\e[K
+ \e[01;35m\e[K~~~~^~~~~\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
x = x + y /* { dg-warning "8: test" } */
/* { dg-begin-multiline-output "" }
x = \e[01;35m\e[Kx\e[m\e[K + \e[32m\e[Ky\e[m\e[K
- \e[01;35m\e[KA\e[m\e[K \e[32m\e[KB
-\e[m\e[K
+ \e[01;35m\e[KA\e[m\e[K \e[32m\e[KB\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
y = 5 /* { dg-warning "6: test" } */
/* { dg-begin-multiline-output "" }
ASSOCIATE (y =>\e[32m\e[K \e[m\e[Kx)
- \e[32m\e[K2
-\e[m\e[K \e[01;35m\e[K \e[m\e[Ky = 5
- \e[01;35m\e[K1
-\e[m\e[K
+ \e[32m\e[K2\e[m\e[K
+ \e[01;35m\e[K \e[m\e[Ky = 5
+ \e[01;35m\e[K1\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
int a[2][2] = { 0, 1 , 2, 3 }; /* { dg-warning "insertion hints" } */
/* { dg-begin-multiline-output "" }
int a[2][2] = { \e[01;35m\e[K0, 1\e[m\e[K , 2, 3 };
- \e[01;35m\e[K^~~~
- {\e[m\e[K \e[01;35m\e[K}\e[m\e[K
+ \e[01;35m\e[K^~~~\e[m\e[K
+ \e[01;35m\e[K{\e[m\e[K \e[01;35m\e[K}\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
int a;; /* { dg-warning "example of a removal hint" } */
/* { dg-begin-multiline-output "" }
int a;\e[01;35m\e[K;\e[m\e[K
- \e[01;35m\e[K^
- -\e[m\e[K
+ \e[01;35m\e[K^\e[m\e[K
+ \e[01;35m\e[K-\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
gtk_widget_showall (dlg); /* { dg-warning "example of a replacement hint" } */
/* { dg-begin-multiline-output "" }
\e[01;35m\e[Kgtk_widget_showall\e[m\e[K (dlg);
- \e[01;35m\e[K^~~~~~~~~~~~~~~~~~
- gtk_widget_show_all\e[m\e[K
+ \e[01;35m\e[K^~~~~~~~~~~~~~~~~~\e[m\e[K
+ \e[01;35m\e[Kgtk_widget_show_all\e[m\e[K
{ dg-end-multiline-output "" } */
#endif
}
pp_show_color (context->printer) = old_show_color;
pp_destroy_prefix (context->printer);
- pp_newline_and_flush (context->printer);
+ pp_flush (context->printer);
}
/* Exercise the diagnostic machinery to emit various warnings,
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-cunrolli-details=stderr -fno-peel-loops -fno-tree-vrp -fdisable-tree-cunroll -fenable-tree-cunrolli" } */
+/* Blank lines can occur in the output of
+ -fdump-tree-cunrolli-details=stderr. */
+/* { dg-allow-blank-lines-in-output 1 } */
+
unsigned a[100], b[100];
inline void bar()
{
! segfault is working correctly. No cleanup needed, because the dump
! goes to stdout.
! { dg-options "-fdump-fortran-original" }
+! { dg-allow-blank-lines-in-output 1 }
! { dg-prune-output "Namespace:.*-{42}" }
program upimp
return [gcc-dg-test-1 gcc_target_compile $prog $do_what $extra_tool_flags]
}
+# Global: should blank lines be allowed in the output?
+# By default, they should not be. (PR other/69006)
+# However, there are some ways for them to validly occur.
+set allow_blank_lines 0
+
+# A command for use by testcases to mark themselves as expecting
+# blank lines in the output.
+
+proc dg-allow-blank-lines-in-output { args } {
+ global allow_blank_lines
+ set allow_blank_lines 1
+}
+
proc gcc-dg-prune { system text } {
global additional_prunes
# Always remember to clear it in .exp file after executed all tests.
global dg_runtest_extra_prunes
+ # Complain about blank lines in the output (PR other/69006)
+ global allow_blank_lines
+ if { !$allow_blank_lines } {
+ set num_blank_lines [llength [regexp -all -inline "\n\n" $text]]
+ if { $num_blank_lines } {
+ global testname_with_flags
+ fail "$testname_with_flags $num_blank_lines blank line(s) in output"
+ }
+ set allow_blank_lines 0
+ }
+
set text [prune_gcc_output $text]
foreach p "$additional_prunes $dg_runtest_extra_prunes" {
set rexp "${rexp}\\|"
} else {
# Assume that we have a quoted source line.
- # Support arbitrary followup text on each line,
- # to deal with comments containing containing DejaGnu
- # directives.
- append rexp ".*"
+ if {![string equal "" $line] } {
+ # Support arbitrary followup text on each non-empty line,
+ # to deal with comments containing containing DejaGnu
+ # directives.
+ append rexp ".*"
+ }
}
append rexp "\n"
}