Improve the change to allow parsing 9%a
If there was a later syntax error, this could incorrectly get reported as: Error: Unknown directive '%a'.
This commit is contained in:
parent
8f54f6180a
commit
8cd2cfa9d1
3 changed files with 24 additions and 3 deletions
20
Examples/test-suite/errors/pp_unknowndirective5.i
Normal file
20
Examples/test-suite/errors/pp_unknowndirective5.i
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
%module xxx
|
||||||
|
|
||||||
|
/* Before SWIG 4.1.0 the `9%a` expression triggered:
|
||||||
|
*
|
||||||
|
* Error: Unknown directive '%a'
|
||||||
|
*
|
||||||
|
* The fix for that works by handling an apparent directive that isn't a
|
||||||
|
* recognised directive by noting down its name, emitting MODULO and then
|
||||||
|
* rescanning what follows, and if the parser then gives a syntax error we
|
||||||
|
* report it as an unknown directive.
|
||||||
|
*
|
||||||
|
* However the initial version of this failed to reset the noted down apparent
|
||||||
|
* directive often enough, so a later syntax error could get incorrectly
|
||||||
|
* reported. Here the syntax error in the declaration of `c` was confusingly
|
||||||
|
* reported as `Error: Unknown directive '%a'`. This was found and fixed prior
|
||||||
|
* to 4.1.0.
|
||||||
|
*/
|
||||||
|
int a;
|
||||||
|
int test2(int b = 9%a) { return b; }
|
||||||
|
void int c;
|
||||||
1
Examples/test-suite/errors/pp_unknowndirective5.stderr
Normal file
1
Examples/test-suite/errors/pp_unknowndirective5.stderr
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
pp_unknowndirective5.i:18: Error: Syntax error in input(1).
|
||||||
|
|
@ -573,6 +573,9 @@ int yylex(void) {
|
||||||
scanner_init();
|
scanner_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Delete(cparse_unknown_directive);
|
||||||
|
cparse_unknown_directive = NULL;
|
||||||
|
|
||||||
if (next_token) {
|
if (next_token) {
|
||||||
l = next_token;
|
l = next_token;
|
||||||
next_token = 0;
|
next_token = 0;
|
||||||
|
|
@ -951,9 +954,6 @@ int yylex(void) {
|
||||||
return (yylex());
|
return (yylex());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Delete(cparse_unknown_directive);
|
|
||||||
cparse_unknown_directive = NULL;
|
|
||||||
|
|
||||||
/* SWIG directives */
|
/* SWIG directives */
|
||||||
if (strcmp(yytext, "%module") == 0)
|
if (strcmp(yytext, "%module") == 0)
|
||||||
return (MODULE);
|
return (MODULE);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue