From 4ba9008ec7842770289645dc6a8829555915086b Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sat, 3 Apr 2021 02:49:54 +0000 Subject: 48379: Make the parameter expansion subscript flags parse error message, "error in flags", identify the location of the parse error. --- ChangeLog | 4 ++++ Src/subst.c | 28 +++++++++++++++++++++++++--- Test/D04parameter.ztst | 5 +++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 429cd0376..461bfeacb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2021-04-08 Daniel Shahaf + * 48379: Src/subst.c, Test/D04parameter.ztst: Make the parameter + expansion subscript flags parse error message, "error in flags", + identify the location of the parse error. + * 48321 (tweaked per thread): Completion/Unix/Type/_perl_modules: Don't assume ${words[1]} to be either "perl" or "perldoc" diff --git a/Src/subst.c b/Src/subst.c index 8f5bd355e..96e0914eb 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -2259,9 +2259,31 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, break; default: - flagerr: - zerr("error in flags"); - return NULL; + flagerr: + { + /* + * We're trying to output the string that failed to + * parse and the offset of the parse error within that. + * + * The string is *str. It hasn't been changed since + * entry to this function, I think, except that the + * first non-variable-declaration line in this function + * (currently the 238th line in this function) + * writes a NUL to the first place in *str, so we'll + * compensate by outputting the dollar sign manually. + */ + char *str_copy_for_output = dupstring(*str + 1); + + /* + * Convert to a 1-based offset, because the shell + * language is 1-based by default. + */ + zlong offset = s - *str + 1; + + untokenize(str_copy_for_output); + zerr("error in flags near position %z in '$%s'", offset, str_copy_for_output); + return NULL; + } } } s++; diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index ac99ff0e3..05bb61bdc 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -2691,3 +2691,8 @@ F:behavior, see http://austingroupbugs.net/view.php?id=888 eval 'echo $(\*)' 0:Backslash character other than newline is normal after $( >What a star + + : ${(zZ+x+):-} +1:parameter expansion flags parsing error gives a clue +?(eval):1: error in flags near position 7 in '${(zZ+x+):-}' + -- cgit 1.4.1