diff --git a/src/las.c b/src/las.c
index e55cdad807b24146a8a728861a2548664ec0078a..71ac1ca3d4acf53c15529c6c64de1525418d923b 100644
--- a/src/las.c
+++ b/src/las.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: las.c,v 1.93 1999/10/23 06:51:26 hubbe Exp $");
+RCSID("$Id: las.c,v 1.94 1999/11/05 01:45:30 grubba Exp $");
 
 #include "language.h"
 #include "interpret.h"
@@ -1922,6 +1922,20 @@ static void optimize(node *n)
       }
       break;
 
+    case F_RANGE:
+      /* X[Y..Z]
+       * Warn if Z is a constant <= 0.
+       */
+      if (CDR(n)->token == F_ARG_LIST &&
+	  CDDR(n)->token == F_CONSTANT &&
+	  ((CDDR(n)->u.sval.type == T_INT &&
+	    CDDR(n)->u.sval.u.integer <= 0) ||
+	   (CDDR(n)->u.sval.type == T_FLOAT &&
+	    CDDR(n)->u.sval.u.float_number <= 0.0))) {
+	yywarning("Range end is not positive.");
+      }
+      break;
+
     case F_ARG_LIST:
     case F_LVALUE_LIST:
       if(!CAR(n)) goto use_cdr;
@@ -1966,13 +1980,25 @@ static void optimize(node *n)
       break;
 
     case '?':
-      /* (! X) ? Y : Z  -> X ? Z : Y */
+      /* (! X) ? Y : Z  ->  X ? Z : Y */
       if(CAR(n)->token == F_NOT)
       {
 	tmp1=mknode('?',CAAR(n),mknode(':',CDDR(n),CADR(n)));
 	CAAR(n)=CDDR(n)=CADR(n)=0;
 	goto use_tmp1;
       }
+      /* 0 ? Y : Z  ->  Z */
+      if (node_is_false(CAR(n))) {
+	tmp1 = CDDR(n);
+	CDDR(n) = 0;
+	goto use_tmp1;
+      }
+      /* 1 ? Y : Z  ->  Y */
+      if (node_is_true(CAR(n))) {
+	tmp1 = CADR(n);
+	CADR(n) = 0;
+	goto use_tmp1;
+      }
       break;
 
     case F_ADD_EQ: