muscles: fix handling of the "@'" escape

When we use `b4_` or `m4_` somewhere in the input, it is escaped as
`b4@'_`/`m4@'_` so that the warning about unexpanded b4_foo/m4_foo
macros does not fire.

But in the case of muscles, the `@'` escape was not recognized, and an
assertion was triggered.

Reported by Han Zheng.
<https://github.com/akimd/bison/issues/91>

* src/muscle-tab.c (COMMON_DECODE): Handle `@'`.
* tests/skeletons.at (Suspicious sequences): Check that case.
This commit is contained in:
Akim Demaille
2022-09-04 08:34:11 +02:00
parent eb83487606
commit 6376364120
2 changed files with 20 additions and 4 deletions

View File

@@ -294,10 +294,11 @@ muscle_location_grow (char const *key, location loc)
case '@': \ case '@': \
switch (*++(Value)) \ switch (*++(Value)) \
{ \ { \
case '@': obstack_sgrow (&muscle_obstack, "@" ); break; \ case '\'': /* Ignore "@'" */ break; \
case '{': obstack_sgrow (&muscle_obstack, "[" ); break; \ case '@': obstack_sgrow (&muscle_obstack, "@" ); break; \
case '}': obstack_sgrow (&muscle_obstack, "]" ); break; \ case '{': obstack_sgrow (&muscle_obstack, "[" ); break; \
default: aver (false); break; \ case '}': obstack_sgrow (&muscle_obstack, "]" ); break; \
default: aver (false); break; \
} \ } \
break; \ break; \
default: \ default: \

View File

@@ -369,5 +369,20 @@ AT_BISON_CHECK([[input1.y]], [], [],
input1.tab.c:13: warning: suspicious sequence in the output: m4@&t@_poison [-Wother] input1.tab.c:13: warning: suspicious sequence in the output: m4@&t@_poison [-Wother]
]]) ]])
# Regression test for <https://github.com/akimd/bison/issues/91>.
AT_DATA([[input2.y]],
[[%define parse.trace {m4@&t@_foo}
%debug
%%
exp:
]])
AT_BISON_CHECK([[input2.y]], [1], [],
[[input2.y:1.1-28: warning: %define variable 'parse.trace' requires keyword values [-Wdeprecated]
input2.y:1.1-28: error: invalid value for %define Boolean variable 'parse.trace'
input2.y:2.1-6: error: %define variable 'parse.trace' redefined
input2.y:1.1-28: note: previous definition
input2.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
]])
AT_CLEANUP AT_CLEANUP