diff --git a/.gitattributes b/.gitattributes
index 913bd7130d1e780d04aedf82f1742fd3e1faae01..44d48808157d0e3acae1809db92813115df5a994 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -319,7 +319,6 @@ testfont binary
 /src/aclocal.m4 foreign_ident
 /src/alloca.c foreign_ident
 /src/apply_low.h foreign_ident
-/src/array.h foreign_ident
 /src/backend.h foreign_ident
 /src/bignum.h foreign_ident
 /src/block_alloc_h.h foreign_ident
diff --git a/src/array.c b/src/array.c
index f6ffdf9057722a85261ceac4031a5a41e668ccd2..e1e44b60b5a5ec72c3ac1aed942aab62234a1b72 100644
--- a/src/array.c
+++ b/src/array.c
@@ -910,12 +910,13 @@ INT32 *get_order(struct array *v, cmpfun fun)
   return current_order;
 }
 
-/* Returns 2 if no relation is established through lfun calls, or 3 if
- * no order defining lfuns (i.e. `< or `>) were found. */
+/* Returns CMPFUN_UNORDERED if no relation is established through lfun
+ * calls, or -CMPFUN_UNORDERED if no order defining lfuns (i.e. `< or
+ * `>) were found. */
 static int lfun_cmp (const struct svalue *a, const struct svalue *b)
 {
   struct program *p;
-  int default_res = 3, fun;
+  int default_res = -CMPFUN_UNORDERED, fun;
 
   if (a->type == T_OBJECT && (p = a->u.object->prog)) {
     if ((fun = FIND_LFUN(p->inherits[a->subtype].prog, LFUN_LT)) != -1) {
@@ -928,7 +929,7 @@ static int lfun_cmp (const struct svalue *a, const struct svalue *b)
 	return -1;
       }
       pop_stack();
-      default_res = 2;
+      default_res = CMPFUN_UNORDERED;
     }
 
     if ((fun = FIND_LFUN(p->inherits[a->subtype].prog, LFUN_GT)) != -1) {
@@ -941,7 +942,7 @@ static int lfun_cmp (const struct svalue *a, const struct svalue *b)
 	return 1;
       }
       pop_stack();
-      default_res = 2;
+      default_res = CMPFUN_UNORDERED;
     }
 
     if ((fun = FIND_LFUN(p->inherits[a->subtype].prog, LFUN_EQ)) != -1) {
@@ -967,7 +968,7 @@ static int lfun_cmp (const struct svalue *a, const struct svalue *b)
 	return 1;
       }
       pop_stack();
-      default_res = 2;
+      default_res = CMPFUN_UNORDERED;
     }
 
     if ((fun = FIND_LFUN(p->inherits[b->subtype].prog, LFUN_GT)) != -1) {
@@ -980,7 +981,7 @@ static int lfun_cmp (const struct svalue *a, const struct svalue *b)
 	return -1;
       }
       pop_stack();
-      default_res = 2;
+      default_res = CMPFUN_UNORDERED;
     }
 
     if ((fun = FIND_LFUN(p->inherits[b->subtype].prog, LFUN_EQ)) != -1) {
@@ -1046,7 +1047,7 @@ static int obj_or_func_cmp (const struct svalue *a, const struct svalue *b)
 
   res = lfun_cmp (a, b);
 
-  if (res == 3) {
+  if (res == -CMPFUN_UNORDERED) {
     /* If the objects had no inequality comparison lfuns to call, use
      * their pointers to get a well defined internal sort order. Let's
      * also group objects cloned from the same program. */
@@ -1056,7 +1057,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 ? -1 : res;
+  return res;
 }
 
 int set_svalue_cmpfun(const struct svalue *a, const struct svalue *b)
@@ -1065,7 +1066,7 @@ int set_svalue_cmpfun(const struct svalue *a, const struct svalue *b)
   if (typediff) {
     if (a->type == T_OBJECT || b->type == T_OBJECT) {
       int res = lfun_cmp (a, b);
-      if (res < 2) return res;
+      if (res != -CMPFUN_UNORDERED) return res;
     }
     return typediff;
   }
@@ -1133,7 +1134,7 @@ int alpha_svalue_cmpfun(const struct svalue *a, const struct svalue *b)
   if (typediff) {
     if (a->type == T_OBJECT || b->type == T_OBJECT) {
       int res = lfun_cmp (a, b);
-      if (res < 2) return res;
+      if (res != -CMPFUN_UNORDERED) return res;
     }
     return typediff;
   }
@@ -1242,7 +1243,9 @@ PMOD_EXPORT void sort_array_destructively(struct array *v)
 
 #define SORT_BY_INDEX
 #define EXTRA_LOCALS int cmpfun_res;
-#define CMP(X,Y) ((cmpfun_res = alpha_svalue_cmpfun(svals + X, svals + Y)) ? \
+#define CMP(X,Y) ((cmpfun_res =						\
+		     (alpha_svalue_cmpfun(svals + X, svals + Y) &	\
+		      ~CMPFUN_UNORDERED)) ?				\
 		  cmpfun_res : pos[X] - pos[Y])
 #define SWAP(X,Y) {							\
   {struct svalue tmp = svals[X]; svals[X] = svals[Y]; svals[Y] = tmp;}	\
diff --git a/src/array.h b/src/array.h
index 15c3b6cb49000e9a7a4756c0fa89c9fc039097a3..1094a17adae211d651d6bcabd6b9ee1670c98982 100644
--- a/src/array.h
+++ b/src/array.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: array.h,v 1.84 2009/11/28 13:13:30 mast Exp $
+|| $Id$
 */
 
 #ifndef ARRAY_H
@@ -94,6 +94,12 @@ extern struct array *gc_internal_array;
 #define allocate_array(X) low_allocate_array((X),0)
 #define allocate_array_no_init(X,Y) low_allocate_array((X),(Y))
 
+/* Special value used for cmpfuns to signify that two values aren't
+ * equal and have no order relation, i.e. one is neither greater nor
+ * lesser than the other. It consists of the largest bit (under the
+ * sign bit) set. */
+#define CMPFUN_UNORDERED (INT_MAX - (INT_MAX >> 1))
+
 typedef int (*cmpfun)(const struct svalue *, const struct svalue *);
 typedef int (*short_cmpfun)(union anything *, union anything *);
 typedef short_cmpfun (*cmpfun_getter)(TYPE_T);