diff --git a/src/expr.c b/src/expr.c index 2d67d8d6..382eec08 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1145,7 +1145,9 @@ static int UnMinus(void) { Value *v = &ValStack[ValStackPtr-1]; if (v->type != INT_TYPE) return E_BAD_TYPE; + int old = v->v.val; v->v.val = -v->v.val; + if (_private_unminus_overflow(old, v->v.val)) return E_2HIGH; return OK; } diff --git a/src/expr.h b/src/expr.h index f721b17b..1c891631 100644 --- a/src/expr.h +++ b/src/expr.h @@ -57,3 +57,4 @@ else \ extern int _private_div(int a, int b); extern int _private_add_overflow(int result, int b, int old); extern int _private_sub_overflow(int result, int b, int old); +extern int _private_unminus_overflow(int a, int b); diff --git a/src/utils.c b/src/utils.c index 6409da36..0993b4e1 100644 --- a/src/utils.c +++ b/src/utils.c @@ -140,3 +140,9 @@ int _private_sub_overflow(int result, int b, int old) return 0; } +int _private_unminus_overflow(int a, int b) +{ + if (a > 0 && b > 0) return 1; + if (a < 0 && b < 0) return 1; + return 0; +}