diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/lex.c | 6 | ||||
-rw-r--r-- | Test/A01grammar.ztst | 6 |
3 files changed, 16 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog index de28c4bac..208280570 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-07-29 Barton E. Schaefer <schaefer@zsh.org> + + * 35953: Src/lex.c, Test/A01grammar.ztst: fix handling of command + substitution in math context, particularly in "for ((...))" + 2015-07-28 Barton E. Schaefer <schaefer@zsh.org> * 35947: Etc/zsh-development-guide: update discussion of module diff --git a/Src/lex.c b/Src/lex.c index b0cd96340..70f3d142a 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -1388,7 +1388,7 @@ dquote_parse(char endchar, int sub) { int pct = 0, brct = 0, bct = 0, intick = 0, err = 0; int c; - int math = endchar == ')' || endchar == ']'; + int math = endchar == ')' || endchar == ']' || infor; int zlemath = math && zlemetacs > zlemetall + addedx - inbufct; while (((c = hgetc()) != endchar || bct || @@ -1995,8 +1995,10 @@ skipcomm(void) #else char *new_tokstr; int new_lexstop, new_lex_add_raw; + int save_infor = infor; struct lexbufstate new_lexbuf; + infor = 0; cmdpush(CS_CMDSUBST); SETPARBEGIN add(Inpar); @@ -2065,6 +2067,7 @@ skipcomm(void) * the recursive parsing. */ lexflags &= ~LEXFLAGS_ZLE; + dbparens = 0; /* restored by zcontext_restore_partial() */ if (!parse_event(OUTPAR) || tok != OUTPAR) lexstop = 1; @@ -2111,6 +2114,7 @@ skipcomm(void) if (!lexstop) SETPAREND cmdpop(); + infor = save_infor; return lexstop; #endif diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst index 59f87fa90..7eedfa6e0 100644 --- a/Test/A01grammar.ztst +++ b/Test/A01grammar.ztst @@ -182,6 +182,12 @@ >1 >2 + for (( $(true); ; )); do break; done + for (( ; $(true); )); do break; done + for (( ; ; $(true) )); do break; done + for (( ; $((1)); )); do break; done +0:regression test, nested cmdsubst in arithmetic `for' loop + for keyvar valvar in key1 val1 key2 val2; do print key=$keyvar val=$valvar done |