[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
maint: diagnostics: be sure to close the styling when lines are too shor
From: |
Akim Demaille |
Subject: |
maint: diagnostics: be sure to close the styling when lines are too short |
Date: |
Sat, 7 Mar 2020 10:05:38 +0100 |
commit e21ff47f5d0b64da693a47b7dd200a1a44a5bbeb
Author: Akim Demaille <address@hidden>
Date: Sat Mar 7 09:57:03 2020 +0100
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.
diff --git a/src/location.c b/src/location.c
index 1af8e673..dbcd67ec 100644
--- a/src/location.c
+++ b/src/location.c
@@ -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);
}
diff --git a/tests/diagnostics.at b/tests/diagnostics.at
index b0b5ee3e..cbf56b77 100644
--- a/tests/diagnostics.at
+++ b/tests/diagnostics.at
@@ -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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- maint: diagnostics: be sure to close the styling when lines are too short,
Akim Demaille <=