about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/lex.c6
-rw-r--r--Test/A01grammar.ztst6
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