diff --git a/src/operators.c b/src/operators.c
index 88d7626e6a120999e0fd4ed41df8429d8d658a0c..81e5b7e2e0209855c219a4e2fd84a94bb90fb7f2 100644
--- a/src/operators.c
+++ b/src/operators.c
@@ -6,7 +6,7 @@
 /**/
 #include "global.h"
 #include <math.h>
-RCSID("$Id: operators.c,v 1.71 1999/11/22 14:17:49 grubba Exp $");
+RCSID("$Id: operators.c,v 1.72 1999/12/11 19:28:43 grubba Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "multiset.h"
@@ -2166,14 +2166,14 @@ void init_operators(void)
   /* function(mixed:int) */
   add_efun2("`!",f_not,"function(mixed:int(0..1))",OPT_TRY_OPTIMIZE,optimize_not,generate_not);
 
-#define CMP_TYPE "!function(!object...:mixed)&function(mixed...:int(0..1))|function(int|float...:int(0..1))|function(string...:int(0..1))"
+#define CMP_TYPE "!function(!(object|mixed)...:mixed)&function(mixed...:int(0..1))|function(int|float...:int(0..1))|function(string...:int(0..1))"
   add_efun2("`<", f_lt,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);
   add_efun2("`<=",f_le,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);
   add_efun2("`>", f_gt,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);
   add_efun2("`>=",f_ge,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);
 
   ADD_EFUN2("`+",f_add,
-	    tOr7(tIfnot(tFuncV(tNone,tNot(tObj),tMix),tFunction),
+	    tOr7(tIfnot(tFuncV(tNone,tNot(tOr(tObj,tMix)),tMix),tFunction),
 		 tFuncV(tInt,tInt,tInt),
 		 tIfnot(tFuncV(tInt,tInt,tMix),
 			tFuncV(tOr(tInt,tFlt),tOr(tInt,tFlt),tFlt)),
@@ -2189,7 +2189,7 @@ void init_operators(void)
 	    OPT_TRY_OPTIMIZE,optimize_binary,generate_sum);
   
   ADD_EFUN2("`-",f_minus,
-	    tOr7(tIfnot(tFuncV(tNone,tNot(tObj),tMix),tFunction),
+	    tOr7(tIfnot(tFuncV(tNone,tNot(tOr(tObj,tMix)),tMix),tFunction),
 		 tFuncV(tInt,tInt,tInt),
 		 tIfnot(tFuncV(tInt,tInt,tMix),
 			tFuncV(tOr(tInt,tFlt),tOr(tInt,tFlt),tFlt)),
@@ -2221,7 +2221,7 @@ void init_operators(void)
 	    "function(array(0=mixed),int:array(0))|"
 	    "function(string,int:string) */
   ADD_EFUN2("`*",f_multiply,
-	    tOr7(tIfnot(tFuncV(tNone,tNot(tObj),tMix),tFunction),
+	    tOr7(tIfnot(tFuncV(tNone,tNot(tOr(tObj,tMix)),tMix),tFunction),
 		 tFunc(tArr(tArr(tSetvar(1,tMix))) 
 		       tArr(tSetvar(1,tMix)),tArr(tVar(1))),
 		 tFuncV(tInt,tInt,tInt),
@@ -2237,7 +2237,7 @@ void init_operators(void)
 	    "!function(int...:mixed)&function(float|int...:float)|"
 	    "function(array(0=mixed),array|int|float...:array(array(0)))|"
 	    "function(string,string|int|float...:array(string)) */
-  ADD_EFUN2("`/",f_divide,tOr5(tIfnot(tFuncV(tNone,tNot(tObj),tMix),tFunction),tFuncV(tInt,tInt,tInt),tIfnot(tFuncV(tNone,tInt,tMix),tFuncV(tNone,tOr(tFlt,tInt),tFlt)),tFuncV(tArr(tSetvar(0,tMix)),tOr3(tArray,tInt,tFlt),tArr(tArr(tVar(0)))),tFuncV(tStr,tOr3(tStr,tInt,tFlt),tArr(tStr))),
+  ADD_EFUN2("`/",f_divide,tOr5(tIfnot(tFuncV(tNone,tNot(tOr(tObj,tMix)),tMix),tFunction),tFuncV(tInt,tInt,tInt),tIfnot(tFuncV(tNone,tInt,tMix),tFuncV(tNone,tOr(tFlt,tInt),tFlt)),tFuncV(tArr(tSetvar(0,tMix)),tOr3(tArray,tInt,tFlt),tArr(tArr(tVar(0)))),tFuncV(tStr,tOr3(tStr,tInt,tFlt),tArr(tStr))),
 	    OPT_TRY_OPTIMIZE,0,generate_divide);
 
   /* function(mixed,object:mixed)|"