Sure, that actually looks to be what other shells do anyhow. Index: expr.c =================================================================== RCS file: /cvs/src/bin/ksh/expr.c,v retrieving revision 1.21 diff -u -p -r1.21 expr.c --- expr.c 1 Jun 2009 19:00:57 -0000 1.21 +++ expr.c 27 Mar 2013 23:13:44 -0000 @@ -341,11 +341,17 @@ evalexpr(Expr_state *es, enum prec prec) break; case O_DIV: case O_DIVASN: - res = vl->val.i / vr->val.i; + if (vl->val.i == LONG_MIN && vr->val.i == -1) + res = LONG_MIN; + else + res = vl->val.i / vr->val.i; break; case O_MOD: case O_MODASN: - res = vl->val.i % vr->val.i; + if (vl->val.i == LONG_MIN && vr->val.i == -1) + res = 0; + else + res = vl->val.i % vr->val.i; break; case O_PLUS: case O_PLUSASN:
On Wed, Mar 27, 2013 at 04:06:22PM -0700, Matthew Dempsky wrote: > On Wed, Mar 27, 2013 at 3:56 PM, Nicholas Marriott > <nicholas.marri...@gmail.com> wrote: > > case O_DIV: > > case O_DIVASN: > > + if (vl->val.i == LONG_MIN && vr->val.i == -1) > > + evalerr(es, ET_STR, "can't represent > > result"); > > res = vl->val.i / vr->val.i; > > break; > > I think LONG_MIN / -1 should still be LONG_MIN. We don't give errors > for other overflow conditions.