Issue a warning when int('0...', 0) returns an int with the sign
folded; this will change in Python 2.4.  On a 32-bit machine, this
happens for 0x80000000 through 0xffffffff, and for octal constants in
the same value range.  No warning is issued if an explicit base is
given, *or* if the string contains a sign (since in those cases no
sign folding ever happens).
diff --git a/Misc/NEWS b/Misc/NEWS
index 8a6e902..f1b3a8b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,7 +10,7 @@
 *Release date: XX-XXX-2003*
 
 Core and builtins
------------------
+----------------
 
 - Through a bytecode optimizer bug (and I bet you didn't even know
   Python *had* a bytecode optimizer :-), "unsigned" hex/oct constants
@@ -24,6 +24,13 @@
   value, but according to PEP 237 it really needs to be 1 now.  This
   will be backported to Python 2.2.3 a well.  (SF #660455)
 
+- int(s, base) sometimes sign-folds hex and oct constants; it only
+  does this when base is 0 and s.strip() starts with a '0'.  When the
+  sign is actually folded, as in int("0xffffffff", 0) on a 32-bit
+  machine, which returns -1, a FutureWarning is now issued; in Python
+  2.4, this will return 4294967295L, as do int("+0xffffffff", 0) and
+  int("0xffffffff", 16) right now.  (PEP 347)
+
 - super(X, x): x may now be a proxy for an X instance, i.e.
   issubclass(x.__class__, X) but not issubclass(type(x), X).
 
diff --git a/Objects/intobject.c b/Objects/intobject.c
index 544e663..fee7e4e 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -187,17 +187,22 @@
 	char *end;
 	long x;
 	char buffer[256]; /* For errors */
+	int warn = 0;
 
 	if ((base != 0 && base < 2) || base > 36) {
-		PyErr_SetString(PyExc_ValueError, "int() base must be >= 2 and <= 36");
+		PyErr_SetString(PyExc_ValueError,
+				"int() base must be >= 2 and <= 36");
 		return NULL;
 	}
 
 	while (*s && isspace(Py_CHARMASK(*s)))
 		s++;
 	errno = 0;
-	if (base == 0 && s[0] == '0')
+	if (base == 0 && s[0] == '0') {
 		x = (long) PyOS_strtoul(s, &end, base);
+		if (x < 0)
+			warn = 1;
+	}
 	else
 		x = PyOS_strtol(s, &end, base);
 	if (end == s || !isalnum(Py_CHARMASK(end[-1])))
@@ -216,6 +221,11 @@
 			return NULL;
 		return PyLong_FromString(s, pend, base);
 	}
+	if (warn) {
+		if (PyErr_Warn(PyExc_FutureWarning,
+			"int('0...', 0): sign will change in Python 2.4") < 0)
+			return NULL;
+	}
 	if (pend)
 		*pend = end;
 	return PyInt_FromLong(x);