diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 71e96024dd4..f030101656c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2016-01-26 David Malcolm + + 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 * configure.ac (ac_cv_std_swap_in_utility): New test. diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 7bd1d5d8fe7..fdc96eabd7c 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2016-01-26 David Malcolm + + PR other/69006 + * c-opts.c (c_diagnostic_finalizer): Replace invocation of + pp_newline_and_flush with pp_flush. + 2016-01-20 Martin Sebor PR c/69405 diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index f2a3815f545..8cc28aff600 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -169,7 +169,7 @@ c_diagnostic_finalizer (diagnostic_context *context, 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. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ee5d0c0748d..b57030b67f7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2016-01-26 David Malcolm + + 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 Revert: diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 370816c64e4..89a00a02a3a 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -3365,8 +3365,8 @@ print_instantiation_partial_context_line (diagnostic_context *context, { pp_verbatim (context->printer, recursive_p - ? _("recursively required from here") - : _("required from here")); + ? _("recursively required from here\n") + : _("required from here\n")); } } @@ -3450,7 +3450,6 @@ print_instantiation_partial_context (diagnostic_context *context, } 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. */ diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c index e32325486af..d9b6750339b 100644 --- a/gcc/diagnostic-show-locus.c +++ b/gcc/diagnostic-show-locus.c @@ -159,6 +159,8 @@ class layout void print_any_fixits (int row, const rich_location *richloc); private: + void print_newline (); + bool get_state_at_point (/* Inputs. */ int row, int column, @@ -574,7 +576,7 @@ layout::print_source_line (int row, line_bounds *lbounds_out) 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; @@ -616,7 +618,7 @@ layout::print_annotation_line (int row, const line_bounds lbounds) pp_character (m_pp, ' '); } } - pp_newline (m_pp); + print_newline (); } /* If there are any fixit hints on source line ROW within RICHLOC, print them. @@ -684,6 +686,18 @@ layout::print_any_fixits (int row, const rich_location *richloc) } } } + + /* 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. @@ -778,7 +792,7 @@ layout::move_to_column (int *column, int dest_column) /* Start a new line if we need to. */ if (*column > dest_column) { - pp_newline (m_pp); + print_newline (); *column = 0; } @@ -798,6 +812,8 @@ void 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) @@ -805,34 +821,23 @@ diagnostic_show_locus (diagnostic_context * context, 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); } diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index effb8f2a9be..f661b57db5a 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -546,7 +546,7 @@ default_diagnostic_finalizer (diagnostic_context *context, { 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 @@ -879,37 +879,6 @@ diagnostic_append_note (diagnostic_context *context, 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); diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 2cb6270ef21..7cc5cff185b 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -293,10 +293,6 @@ extern void diagnostic_set_info_translated (diagnostic_info *, const char *, 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 *); diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5853ddf374c..a137e919fe4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2016-01-26 David Malcolm + + PR other/69006 + * error.c (gfc_diagnostic_starter): Delete use of pp_newline. + 2016-01-23 Jerry DeLisle PR fortran/69397 diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c index 7388706d583..e7f4ba7dac0 100644 --- a/gcc/fortran/error.c +++ b/gcc/fortran/error.c @@ -1096,7 +1096,6 @@ gfc_diagnostic_starter (diagnostic_context *context, /* 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); diff --git a/gcc/pretty-print.h b/gcc/pretty-print.h index 6a44fbc5b7e..f49f35ac610 100644 --- a/gcc/pretty-print.h +++ b/gcc/pretty-print.h @@ -125,7 +125,11 @@ output_buffer_append_r (output_buffer *buff, const char *start, int length) { 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3d0cc309eef..18aa8af737f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,23 @@ +2016-01-26 David Malcolm + + 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 PR tree-optimization/69483 diff --git a/gcc/testsuite/g++.dg/ext/timevar1.C b/gcc/testsuite/g++.dg/ext/timevar1.C index 0d2d3f5f31d..a48f8ba3705 100644 --- a/gcc/testsuite/g++.dg/ext/timevar1.C +++ b/gcc/testsuite/g++.dg/ext/timevar1.C @@ -1,5 +1,6 @@ // 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" } diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c index 199e0b20d61..a59025870a6 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c @@ -15,8 +15,7 @@ void test_simple (void) /* { dg-begin-multiline-output "" } myvar = myvar.x; - ~~~~~^~ - + ~~~~~^~ { dg-end-multiline-output "" } */ #endif } @@ -28,8 +27,7 @@ void test_simple_2 (void) /* { dg-begin-multiline-output "" } x = first_function () + second_function (); - ~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~ - + ~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~ { dg-end-multiline-output "" } */ #endif } @@ -42,11 +40,10 @@ void test_multiline (void) + second_function ()); /* { dg-warning "test" } */ /* { dg-begin-multiline-output "" } - x = (first_function () -  ~~~~~~~~~~~~~~~~~ - + second_function ()); - ^ ~~~~~~~~~~~~~~~~~~ - + x = (first_function () + ~~~~~~~~~~~~~~~~~ + + second_function ()); + ^ ~~~~~~~~~~~~~~~~~~ { dg-end-multiline-output "" } */ #endif } @@ -67,29 +64,28 @@ void test_many_lines (void) magna, aliqua)); /* { dg-begin-multiline-output "" } - x = (first_function_with_a_very_long_name (lorem, ipsum, dolor, sit, amet, -  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -  consectetur, adipiscing, elit, -  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -  sed, eiusmod, tempor, -  ~~~~~~~~~~~~~~~~~~~~~ -  incididunt, ut, labore, et, -  ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -  dolore, magna, aliqua) -  ~~~~~~~~~~~~~~~~~~~~~~ - + second_function_with_a_very_long_name (lorem, ipsum, dolor, sit, -  ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -  amet, consectetur, -  ~~~~~~~~~~~~~~~~~~ -  adipiscing, elit, sed, -  ~~~~~~~~~~~~~~~~~~~~~~ -  eiusmod, tempor, incididunt, -  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -  ut, labore, et, dolore, -  ~~~~~~~~~~~~~~~~~~~~~~~ -  magna, aliqua)); - ~~~~~~~~~~~~~~ - + x = (first_function_with_a_very_long_name (lorem, ipsum, dolor, sit, amet, + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +  consectetur, adipiscing, elit, + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +  sed, eiusmod, tempor, + ~~~~~~~~~~~~~~~~~~~~~ +  incididunt, ut, labore, et, + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +  dolore, magna, aliqua) + ~~~~~~~~~~~~~~~~~~~~~~ + + second_function_with_a_very_long_name (lorem, ipsum, dolor, sit, + ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +  amet, consectetur, + ~~~~~~~~~~~~~~~~~~ +  adipiscing, elit, sed, + ~~~~~~~~~~~~~~~~~~~~~~ +  eiusmod, tempor, incididunt, + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +  ut, labore, et, dolore, + ~~~~~~~~~~~~~~~~~~~~~~~ +  magna, aliqua)); + ~~~~~~~~~~~~~~ { dg-end-multiline-output "" } */ #endif } @@ -100,8 +96,7 @@ void test_richloc_from_proper_range (void) float f = 98.6f; /* { dg-warning "test" } */ /* { dg-begin-multiline-output "" } float f = 98.6f; - ^~~~~ - + ^~~~~ { dg-end-multiline-output "" } */ #endif } @@ -112,8 +107,7 @@ void test_caret_within_proper_range (void) float f = foo * bar; /* { dg-warning "17: test" } */ /* { dg-begin-multiline-output "" } float f = foo * bar; - ~~~~^~~~~ - + ~~~~^~~~~ { dg-end-multiline-output "" } */ #endif } @@ -124,8 +118,7 @@ void test_very_wide_line (void) float f = foo * bar; /* { dg-warning "95: test" } */ /* { dg-begin-multiline-output "" } float f = foo * bar; - ~~~~^~~~~ - + ~~~~^~~~~ { dg-end-multiline-output "" } */ #endif } @@ -136,8 +129,7 @@ void test_multiple_carets (void) x = x + y /* { dg-warning "8: test" } */ /* { dg-begin-multiline-output "" } x = x + y - A B - + A B { dg-end-multiline-output "" } */ #endif } @@ -149,10 +141,9 @@ void test_caret_on_leading_whitespace (void) y = 5 /* { dg-warning "6: test" } */ /* { dg-begin-multiline-output "" } ASSOCIATE (y => x) - 2 -  y = 5 - 1 - + 2 +  y = 5 + 1 { dg-end-multiline-output "" } */ #endif } @@ -166,8 +157,8 @@ void test_fixit_insert (void) int a[2][2] = { 0, 1 , 2, 3 }; /* { dg-warning "insertion hints" } */ /* { dg-begin-multiline-output "" } int a[2][2] = { 0, 1 , 2, 3 }; - ^~~~ - { } + ^~~~ + { } { dg-end-multiline-output "" } */ #endif } @@ -180,8 +171,8 @@ void test_fixit_remove (void) int a;; /* { dg-warning "example of a removal hint" } */ /* { dg-begin-multiline-output "" } int a;; - ^ - - + ^ + - { dg-end-multiline-output "" } */ #endif } @@ -194,8 +185,8 @@ void test_fixit_replace (void) gtk_widget_showall (dlg); /* { dg-warning "example of a replacement hint" } */ /* { dg-begin-multiline-output "" } gtk_widget_showall (dlg); - ^~~~~~~~~~~~~~~~~~ - gtk_widget_show_all + ^~~~~~~~~~~~~~~~~~ + gtk_widget_show_all { dg-end-multiline-output "" } */ #endif } diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c index 02a2aef3d4c..b4f12ba68c1 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c @@ -137,7 +137,7 @@ custom_diagnostic_finalizer (diagnostic_context *context, 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, diff --git a/gcc/testsuite/gcc.dg/unroll-2.c b/gcc/testsuite/gcc.dg/unroll-2.c index 7c9495d0261..05a141056d7 100644 --- a/gcc/testsuite/gcc.dg/unroll-2.c +++ b/gcc/testsuite/gcc.dg/unroll-2.c @@ -1,6 +1,10 @@ /* { 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() { diff --git a/gcc/testsuite/gfortran.dg/implicit_class_1.f90 b/gcc/testsuite/gfortran.dg/implicit_class_1.f90 index 64193daa161..2ab90405eb0 100644 --- a/gcc/testsuite/gfortran.dg/implicit_class_1.f90 +++ b/gcc/testsuite/gfortran.dg/implicit_class_1.f90 @@ -8,6 +8,7 @@ ! 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 diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp index c0033283313..3dd85645395 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -310,6 +310,19 @@ proc gcc-dg-test { prog do_what extra_tool_flags } { 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 @@ -317,6 +330,17 @@ proc gcc-dg-prune { system text } { # 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" { diff --git a/gcc/testsuite/lib/multiline.exp b/gcc/testsuite/lib/multiline.exp index fd7affcfafd..a2e963e555f 100644 --- a/gcc/testsuite/lib/multiline.exp +++ b/gcc/testsuite/lib/multiline.exp @@ -224,10 +224,12 @@ proc _build_multiline_regex { multiline index } { 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" }