Hi, as PR diagnostic/84034 shows, source files with dos style line endings can cause a glitch in the terminal emulation that erases the source line that is supposed to be shown.
That happens when the colorizing escape sequences are printed between the CR and the LF. Apparently the LF is being ignored and thus the following line overwrites everything from the last source line. The following patch fixes the visual glitch by handling a CR '\r' like a TAB '\t' character. Bootstrapped and reg-rested in x86_64-pc-linux-gnu. OK for trunk? Thanks Bernd.
2018-01-25 Bernd Edlinger <bernd.edlin...@hotmail.de> PR diagnostic/84034 * diagnostic-show-locus.c (get_line_width_without_trailing_whitespace): Handle CR like TAB. (layout::print_source_line): Likewise. (test_get_line_width_without_trailing_whitespace): Add test cases. Index: gcc/diagnostic-show-locus.c =================================================================== --- gcc/diagnostic-show-locus.c (revision 257048) +++ gcc/diagnostic-show-locus.c (working copy) @@ -639,7 +639,7 @@ get_line_width_without_trailing_whitespace (const while (result > 0) { char ch = line[result - 1]; - if (ch == ' ' || ch == '\t') + if (ch == ' ' || ch == '\t' || ch == '\r') result--; else break; @@ -648,7 +648,8 @@ get_line_width_without_trailing_whitespace (const gcc_assert (result <= line_width); gcc_assert (result == 0 || (line[result - 1] != ' ' - && line[result -1] != '\t')); + && line[result -1] != '\t' + && line[result -1] != '\r')); return result; } @@ -673,9 +674,11 @@ test_get_line_width_without_trailing_whitespace () assert_eq ("", 0); assert_eq (" ", 0); assert_eq ("\t", 0); + assert_eq ("\r", 0); assert_eq ("hello world", 11); assert_eq ("hello world ", 11); assert_eq ("hello world \t\t ", 11); + assert_eq ("hello world\r", 11); } #endif /* #if CHECKING_P */ @@ -1176,8 +1179,8 @@ layout::print_source_line (int row, const char *li else m_colorizer.set_normal_text (); } - char c = *line == '\t' ? ' ' : *line; - if (c == '\0') + char c = *line; + if (c == '\0' || c == '\t' || c == '\r') c = ' '; if (c != ' ') {