* $((++a++))
@ 2017-09-04 20:45 ` Martijn Dekker
2017-09-05 10:01 ` $((++a++)) Peter Stephenson
0 siblings, 1 reply; 2+ messages in thread
From: Martijn Dekker @ 2017-09-04 20:45 UTC (permalink / raw)
To: Zsh hackers list
Why is this accepted?
% a=1
% echo $((++a++))
2
% echo $((--a--))
1
Looks like that should be an invalid arithmetic expression.
- M.
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: $((++a++))
2017-09-04 20:45 ` $((++a++)) Martijn Dekker
@ 2017-09-05 10:01 ` Peter Stephenson
0 siblings, 0 replies; 2+ messages in thread
From: Peter Stephenson @ 2017-09-05 10:01 UTC (permalink / raw)
To: Zsh hackers list
On Mon, 4 Sep 2017 22:45:46 +0200
Martijn Dekker <martijn@inlv.org> wrote:
> Why is this accepted?
>
> % a=1
> % echo $((++a++))
> 2
> % echo $((--a--))
> 1
>
> Looks like that should be an invalid arithmetic expression.
After staring at this for long enough, I realised it was trivial. The
current code is in fact doing too much work in order to get it wrong...
pws
diff --git a/Src/math.c b/Src/math.c
index f961300..c383160 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -1306,8 +1306,6 @@ op(int what)
spval->type = MN_INTEGER;
} else
spval->u.l = !spval->u.l;
- stack[sp].lval = NULL;
- stack[sp].pval = NULL;
break;
case COMP:
if (spval->type & MN_FLOAT) {
@@ -1315,8 +1313,6 @@ op(int what)
spval->type = MN_INTEGER;
} else
spval->u.l = ~spval->u.l;
- stack[sp].lval = NULL;
- stack[sp].pval = NULL;
break;
case POSTPLUS:
a = *spval;
@@ -1335,16 +1331,12 @@ op(int what)
(void)setmathvar(stack + sp, a);
break;
case UPLUS:
- stack[sp].lval = NULL;
- stack[sp].pval = NULL;
break;
case UMINUS:
if (spval->type & MN_FLOAT)
spval->u.d = -spval->u.d;
else
spval->u.l = -spval->u.l;
- stack[sp].lval = NULL;
- stack[sp].pval = NULL;
break;
case QUEST:
DPUTS(sp < 2, "BUG: math: three shall be the number of the counting.");
@@ -1377,6 +1369,8 @@ op(int what)
zerr("bad math expression: out of integers");
return;
}
+ stack[sp].lval = NULL;
+ stack[sp].pval = NULL;
}
diff --git a/Test/C01arith.ztst b/Test/C01arith.ztst
index 61da763..30409ad 100644
--- a/Test/C01arith.ztst
+++ b/Test/C01arith.ztst
@@ -420,3 +420,16 @@
0:type of variable when created in arithmetic context
>integer
>scalar
+
+ integer a=1
+ print $(( ++a * 2 ))
+ print $(( ++a ))
+ print $(( a++ * 2 ))
+ print $(( a ))
+ print $(( ++a++ * 2 ))
+1: Allow rvalue but not lvalue operations with result of increment
+>4
+>3
+>6
+>4
+?(eval):6: bad math expression: lvalue required
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-09-05 10:01 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <CGME20170904210547epcas2p2e46e1cb14a26b8e5fdd9217c58c077ff@epcas2p2.samsung.com>
2017-09-04 20:45 ` $((++a++)) Martijn Dekker
2017-09-05 10:01 ` $((++a++)) Peter Stephenson
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).