Index: library/integer.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/library/integer.m,v
retrieving revision 1.29
diff -u -r1.29 integer.m
--- library/integer.m	23 Nov 2007 07:35:56 -0000	1.29
+++ library/integer.m	1 Apr 2010 04:32:42 -0000
@@ -97,6 +97,10 @@
 :- func integer.float(integer) = float.
 :- func integer.int(integer) = int.
 
+    % As above but wraps on overflow rather than aborting.
+    %
+:- func integer.int_with_overflow(integer) = int.
+
 :- func integer.zero = integer.
 
 :- func integer.one = integer.
@@ -1001,6 +1005,17 @@
         error("integer.int: domain error (conversion would overflow)")
     ).
 
+% Since most machines are 2's complement, we take the AND with max_int*2 + 1,
+% which is an int with all bits set to 1.
+% XXX: What about machines that aren't 2's complement?
+% Note: Can't just call int_list, as int overflow in Mercury is undefined.
+
+integer.int_with_overflow(Integer) = Int :-
+    AllBits = (integer(int.max_int) << 1) \/ integer.one,
+    Wrapped = Integer /\ AllBits,
+    Wrapped = i(_Sign, Digits),
+    Int = int_list(Digits, 0).
+
 :- func int_list(list(int), int) = int.
 
 int_list([], Accum) = Accum.
