about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Doc/Zsh/arith.yo2
-rw-r--r--Src/math.c13
3 files changed, 15 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index a9fd645f2..d6d0ec43a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2007-06-15  Peter Stephenson  <pws@csr.com>
 
-	* 23553: Doc/Zsh/arith.yo, Doc/Zsh/builtins.yo: was missed out.
+	* 23553: Doc/Zsh/arith.yo, Doc/Zsh/builtins.yo, Src/math.c:
+	should have been committed but wasn't.
 
 2007-06-14  Peter Stephenson  <pws@csr.com>
 
diff --git a/Doc/Zsh/arith.yo b/Doc/Zsh/arith.yo
index f13cad987..98e83c1ae 100644
--- a/Doc/Zsh/arith.yo
+++ b/Doc/Zsh/arith.yo
@@ -22,7 +22,7 @@ matching `tt(RPAR()RPAR())' are treated as a quoted expression and
 arithmetic expansion performed as for an argument of tt(let).  More
 precisely, `tt(LPAR()LPAR())var(...)tt(RPAR()RPAR())' is equivalent to
 `tt(let ")var(...)tt(")'.  The return status is 0 if the arithmetic value
-of the expression is non-zero, and 1 otherwise.
+of the expression is non-zero, 1 if it is zero, and 2 if an error occurred.
 
 For example, the following statement
 
diff --git a/Src/math.c b/Src/math.c
index 66d57fd53..e1cde5f03 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -1061,8 +1061,19 @@ mathevall(char *s, int prek, char **ep)
 	  "BUG: math: wallabies roaming too freely in outback");
 
     if (errflag) {
+	/*
+	 * This used to set the return value to errflag.
+	 * I don't understand how that could be useful; the
+	 * caller doesn't know that's what's happened and
+	 * may not get a value at all.
+	 * Worse, we reset errflag in execarith() and setting
+	 * this explicitly non-zero means a (( ... )) returns
+	 * status 0 if there's an error.  That surely can't
+	 * be right.  execarith() now detects an error and returns
+	 * status 2.
+	 */
 	ret.type = MN_INTEGER;
-	ret.u.l = errflag;
+	ret.u.l = 0;
     } else {
 	if (stack[0].val.type == MN_UNSET)
 	    ret = getnparam(stack[0].lval);