about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Src/cond.c7
-rw-r--r--Src/parse.c13
-rw-r--r--Test/04redirect.ztst5
-rw-r--r--Test/07cond.ztst9
4 files changed, 28 insertions, 6 deletions
diff --git a/Src/cond.c b/Src/cond.c
index 4a78bd5e7..1df5b5617 100644
--- a/Src/cond.c
+++ b/Src/cond.c
@@ -43,7 +43,8 @@ evalcond(Estate state)
 {
     struct stat *st;
     char *left, *right = NULL;
-    wordcode code = *state->pc++;
+    Wordcode pcode = state->pc++;
+    wordcode code = *pcode;
     int ctype = WC_COND_TYPE(code);
 
     switch (ctype) {
@@ -57,7 +58,7 @@ evalcond(Estate state)
 		fprintf(stderr, " %s", condstr[ctype]);
 	    return evalcond(state);
 	} else {
-	    state->pc += WC_COND_SKIP(code) - 1;
+	    state->pc = pcode + (WC_COND_SKIP(code) + 1);
 	    return 0;
 	}
     case COND_OR:
@@ -66,7 +67,7 @@ evalcond(Estate state)
 		fprintf(stderr, " %s", condstr[ctype]);
 	    return evalcond(state);
 	} else {
-	    state->pc += WC_COND_SKIP(code) - 1;
+	    state->pc = pcode + (WC_COND_SKIP(code) + 1);
 	    return 1;
 	}
     case COND_MOD:
diff --git a/Src/parse.c b/Src/parse.c
index 11aa0b60f..ecb88536b 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -1727,7 +1727,7 @@ yyerror(int noerr)
  * Word code layout:
  *
  *   WC_END
- *     - only used for empty functions
+ *     - end of program code
  *
  *   WC_LIST
  *     - data contains type (sync, ...)
@@ -2217,6 +2217,14 @@ ecomp(struct node *n)
 	    }
 	}
 	break;
+    case N_COND:
+	eccond((Cond) n);
+	break;
+#ifdef DEBUG
+    default:
+	dputs("BUG: node type not handled in ecomp().");
+	break;
+#endif
     }
 }
 
@@ -2335,8 +2343,7 @@ execompile(List list)
     ecsoffs = ecnpats = 0;
 
     ec(list);
-    if (!ecused)
-	ecadd(WCB_END());
+    ecadd(WCB_END());
 
     ret = (Eprog) zhalloc(sizeof(*ret));
     ret->len = ((ecnpats * sizeof(Patprog)) +
diff --git a/Test/04redirect.ztst b/Test/04redirect.ztst
index 37b0915a0..d7156e856 100644
--- a/Test/04redirect.ztst
+++ b/Test/04redirect.ztst
@@ -191,6 +191,11 @@
 1:null redir with NULLCMD unset
 ?ZTST_execchunk:2: redirection with no command
 
+  echo this should still work >out1
+  print "$(<out1)"
+0:null redir in $(...) with NULLCMD unset
+>this should still work
+
   READNULLCMD=cat
   print cat input >out1
   <out1
diff --git a/Test/07cond.ztst b/Test/07cond.ztst
index aba12030b..f4127072f 100644
--- a/Test/07cond.ztst
+++ b/Test/07cond.ztst
@@ -140,3 +140,12 @@
 
   [[ -e /dev/fd/0 ]]
 0:/dev/fd support in conds
+
+  [[ ( -z foo && -z foo ) || -z foo ]]
+1:complex conds with skipping
+
+  [ '' != bar -a '' = '' ]
+0:strings with `[' builtin
+
+  [ `echo 0` -lt `echo 1` ]
+0:substituion in `[' builtin