diff --git a/src/array.c b/src/array.c
index e2aba3abc6c6e6523b3556d6cde8d8ff0b325f6b..f6ffdf9057722a85261ceac4031a5a41e668ccd2 100644
--- a/src/array.c
+++ b/src/array.c
@@ -1056,7 +1056,7 @@ static int obj_or_func_cmp (const struct svalue *a, const struct svalue *b)
       return a->u.object->prog < b->u.object->prog ? -1 : 1;
   }
 
-  return res == 2 ? 0 : res;
+  return res == 2 ? -1 : res;
 }
 
 int set_svalue_cmpfun(const struct svalue *a, const struct svalue *b)
diff --git a/src/testsuite.in b/src/testsuite.in
index f6870284a47e1cb96dafa3f056669b45dd788f36..3356cd526a444df4a682045c5145e585105fb940 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -5435,6 +5435,18 @@ test_any_equal([[
   return sort ((array) (m - (<>)));
 ]], ({"2", "Stone"}))
 
+test_any([[
+  class X (int i) {
+    int `< (mixed o) {return 0;}
+    int `== (mixed o) {return 0;}
+  };
+  multiset m = (<X(2)>);
+  m[X(4)] = 1;
+  m[X(1)] = 1;
+  m[X(3)] = 1;
+  return sizeof (m);
+]], 4)
+
 // mapping tests
 
 test_any([[mapping m=([]);int e;