From 225b35c9070f94cf79c90c33ffcee84b281f894d Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Wed, 8 Aug 2018 17:11:54 +0100
Subject: 43261: Fix unary minus with base.
Apply unary minus to a complete lexical constant rather than the
first component that comes along.
---
ChangeLog | 5 +++++
Src/math.c | 15 +++++++++++++--
Test/C01arith.ztst | 4 ++++
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 7a4cb05a2..28f70f48a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-08 Peter Stephenson
+
+ * 43261: Src/math.c, Test/C01arith.ztst: Apply unary minus to
+ entire lexical constant, so base doesn't get treated as negative.
+
2018-08-07 Peter Stephenson
* Anton Shestakov: 43254: Completion/Unix/Command/_hg: Remove hg
diff --git a/Src/math.c b/Src/math.c
index 4b7ecf0ab..b08e05cb4 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -640,8 +640,19 @@ zzlex(void)
}
if (unary) {
if (idigit(*ptr) || *ptr == '.') {
- ptr--;
- return lexconstant();
+ int ctype = lexconstant();
+ if (ctype == NUM)
+ {
+ if (yyval.type == MN_FLOAT)
+ {
+ yyval.u.d = -yyval.u.d;
+ }
+ else
+ {
+ yyval.u.l = -yyval.u.l;
+ }
+ }
+ return ctype;
} else
return UMINUS;
} else
diff --git a/Test/C01arith.ztst b/Test/C01arith.ztst
index 77a46ebd5..f1364ab36 100644
--- a/Test/C01arith.ztst
+++ b/Test/C01arith.ztst
@@ -467,3 +467,7 @@
>6
>4
?(eval):6: bad math expression: lvalue required
+
+ print $(( -2#101-16#f ))
+0: Unary minus doesn't apply to base but to number as a whole.
+>-20
--
cgit 1.4.1