diagnostics: be sure to close the styling when lines are too short

bar.y:4.12-17: <error>error:</error> redefining user token number of foo
    -    4 | %token foo <error>123
    +    4 | %token foo <error>123</error>
           |            <error>^~~~~~</error>

* src/location.c (location_caret): Be sure to close.
* tests/diagnostics.at (Line is too short, and then you die): New.
This commit is contained in:
Akim Demaille
2020-03-07 09:57:03 +01:00
parent b82b387da9
commit e21ff47f5d
2 changed files with 48 additions and 1 deletions

View File

@@ -461,6 +461,12 @@ location_caret (location loc, const char *style, FILE *out)
break;
}
}
// The line is shorter than expected.
if (opened)
{
end_use_class (style, out);
opened = false;
}
putc ('\n', out);
}

View File

@@ -152,6 +152,47 @@ input.y: <warning>warning:</warning> fix-its can be applied. Rerun with option
]])
## ------------------------------------- ##
## Line is too short, and then you die. ##
## ------------------------------------- ##
# We trust the "#line", since that's what allows us to quote the
# actual source from which the gramar file was generated. But #line
# can also be wrong, and point to a line which is shorter that the bad
# one. In which case we can easily forget to close the styling.
#
# Be sure to have #line point to a line long enough to open the
# styling, but not enough to close it.
AT_TEST([[Line is too short, and then you die]],
[[// Beware that there are 9 lines inserted before (including this one).
#line 12
%token foo 123
%token foo 123123
%token foo 123
%%
exp:
]],
[1],
[[input.y:13.8-10: <warning>warning:</warning> symbol foo redeclared [<warning>-Wother</warning>]
13 | %token <warning>foo</warning> 123
| <warning>^~~</warning>
input.y:12.8-10: previous declaration
12 | %token <note>foo</note> 123123
| <note>^~~</note>
input.y:13.12-17: <error>error:</error> redefining user token number of foo
13 | %token foo <error>123</error>
| <error>^~~~~~</error>
input.y:14.8-10: <warning>warning:</warning> symbol foo redeclared [<warning>-Wother</warning>]
14 | %%
| <warning>^~~</warning>
input.y:12.8-10: previous declaration
12 | %token <note>foo</note> 123123
| <note>^~~</note>
]])
## -------------------------------------- ##
## Tabulations and multibyte characters. ##
## -------------------------------------- ##
@@ -262,7 +303,7 @@ input.y:10.1-27: <error>error:</error> %define variable 'error2' is not used
## ----------------- ##
# Carriage-return used to count as a newline in the scanner, and not
# in diagnostics. Resulting in all sort of nice bugs.
# in diagnostics. Resulting in all kinds of nice bugs.
AT_TEST([[Carriage return]],
[[^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M