From: ceriel Date: Wed, 19 Aug 1987 18:07:41 +0000 (+0000) Subject: changed code for loops a bit, and fixed an error in MkCoercion X-Git-Tag: release-5-5~3878 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=0983b7700ff8cd31be4904dc71390448ffa70f0c;p=ack.git changed code for loops a bit, and fixed an error in MkCoercion --- diff --git a/lang/m2/comp/chk_expr.c b/lang/m2/comp/chk_expr.c index 96fc22069..285cadaba 100644 --- a/lang/m2/comp/chk_expr.c +++ b/lang/m2/comp/chk_expr.c @@ -63,12 +63,10 @@ MkCoercion(pnd, tp) if (nd_tp->tp_fund == T_STRING) return; nd_tp = BaseType(nd_tp); if (nd->nd_class == Value) { + if (nd_tp->tp_fund == T_REAL && tp->tp_fund != T_REAL) goto Out; switch(tp->tp_fund) { case T_REAL: - if (nd_tp->tp_fund == T_REAL) { - break; - } - goto Out; + break; case T_SUBRANGE: if (! chk_bounds(tp->sub_lb, nd->nd_INT, BaseType(tp)->tp_fund) || @@ -92,8 +90,7 @@ MkCoercion(pnd, tp) case T_INTORCARD: case T_CARDINAL: case T_POINTER: - if ((nd_tp->tp_fund == T_INTEGER && - nd->nd_INT < 0) || + if ((nd_tp->tp_fund == T_INTEGER && nd->nd_INT < 0) || (nd->nd_INT & ~full_mask[(int)(tp->tp_size)])) { node_warning(nd, W_ORDINARY, diff --git a/lang/m2/comp/em_m2.6 b/lang/m2/comp/em_m2.6 index 5732581ee..45befce08 100644 --- a/lang/m2/comp/em_m2.6 +++ b/lang/m2/comp/em_m2.6 @@ -69,6 +69,8 @@ retained. make INTEGER ranges symmetric, t.i., MIN(INTEGER) = - MAX(INTEGER). This is useful for interpreters that use the "real" MIN(INTEGER) to indicate "undefined". +.IP \fB-R\fR +disable all range checks. .LP .SH FILES .IR ~em/lib/em_m2 : diff --git a/lang/m2/comp/walk.c b/lang/m2/comp/walk.c index 4baa69eb8..2480f3ba8 100644 --- a/lang/m2/comp/walk.c +++ b/lang/m2/comp/walk.c @@ -501,9 +501,6 @@ WalkStat(nd, exit_label) W_ORDINARY, "zero stepsize in FOR loop"); } - if (stepsize < 0) { - stepsize = -stepsize; - } fnd = left->nd_right; if (good_forvar) { bstp = BaseType(nd->nd_type); @@ -523,6 +520,7 @@ WalkStat(nd, exit_label) ForLoopVarExpr(nd); } else { + stepsize = -stepsize; C_zlt(l2); ForLoopVarExpr(nd); C_lol(tmp); @@ -531,8 +529,6 @@ WalkStat(nd, exit_label) if (stepsize) { C_loc(stepsize); C_dvu(int_size); - C_loc((arith) 1); - C_adu(int_size); } C_stl(tmp); nd->nd_def->df_flags |= D_FORLOOP; @@ -540,13 +536,13 @@ WalkStat(nd, exit_label) } WalkNode(right, exit_label); nd->nd_def->df_flags &= ~D_FORLOOP; - if (stepsize && good_forvar) { + if (good_forvar && stepsize) { + C_lol(tmp); + C_zeq(l2); C_lol(tmp); C_loc((arith) 1); C_sbu(int_size); C_stl(tmp); - C_lol(tmp); - C_zeq(l2); C_loc(left->nd_INT); ForLoopVarExpr(nd); C_adu(int_size);