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.

Reply via email to