mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user