From 8cd2cfa9d1dcbdda0fdf29029b001a90c30b1a58 Mon Sep 17 00:00:00 2001 From: Olly Betts Date: Fri, 4 Mar 2022 17:00:20 +1300 Subject: [PATCH] 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'. --- .../test-suite/errors/pp_unknowndirective5.i | 20 +++++++++++++++++++ .../errors/pp_unknowndirective5.stderr | 1 + Source/CParse/cscanner.c | 6 +++--- 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 Examples/test-suite/errors/pp_unknowndirective5.i create mode 100644 Examples/test-suite/errors/pp_unknowndirective5.stderr diff --git a/Examples/test-suite/errors/pp_unknowndirective5.i b/Examples/test-suite/errors/pp_unknowndirective5.i new file mode 100644 index 000000000..f5fb0f5e7 --- /dev/null +++ b/Examples/test-suite/errors/pp_unknowndirective5.i @@ -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; diff --git a/Examples/test-suite/errors/pp_unknowndirective5.stderr b/Examples/test-suite/errors/pp_unknowndirective5.stderr new file mode 100644 index 000000000..1c5525ab4 --- /dev/null +++ b/Examples/test-suite/errors/pp_unknowndirective5.stderr @@ -0,0 +1 @@ +pp_unknowndirective5.i:18: Error: Syntax error in input(1). diff --git a/Source/CParse/cscanner.c b/Source/CParse/cscanner.c index 44ac39bd3..85d350cdc 100644 --- a/Source/CParse/cscanner.c +++ b/Source/CParse/cscanner.c @@ -573,6 +573,9 @@ int yylex(void) { scanner_init(); } + Delete(cparse_unknown_directive); + cparse_unknown_directive = NULL; + if (next_token) { l = next_token; next_token = 0; @@ -951,9 +954,6 @@ int yylex(void) { return (yylex()); } else { - Delete(cparse_unknown_directive); - cparse_unknown_directive = NULL; - /* SWIG directives */ if (strcmp(yytext, "%module") == 0) return (MODULE);