From: Mark Dickinson <dickinsm@gmail.com>
Date: Wed, 16 Jul 2008 11:04:17 +0000 (+0000)
Subject: Issue #3360: Fix incorrect parsing of '020000000000.0'.
X-Git-Tag: v2.5.3c1~78
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ab396e07cc7c6aff0723d406f3037b24645b6049;p=python

Issue #3360: Fix incorrect parsing of '020000000000.0'.
This is a backport of r65005.
---

diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 0aba1c213d..79127eb78d 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -209,6 +209,10 @@ if 1:
         self.assertEqual(eval("000000000000007"), 7)
         self.assertEqual(eval("000000000000008."), 8.)
         self.assertEqual(eval("000000000000009."), 9.)
+        self.assertEqual(eval("020000000000.0"), 20000000000.0)
+        self.assertEqual(eval("037777777777e0"), 37777777777.0)
+        self.assertEqual(eval("01000000000000000000000.0"),
+                         1000000000000000000000.0)
 
     def test_unary_minus(self):
         # Verify treatment of unary minus on negative numbers SF bug #660455
diff --git a/Misc/NEWS b/Misc/NEWS
index fa9c9a6b6c..25ac14e700 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.5.3?
 Core and builtins
 -----------------
 
+- Issue #3360: Fix incorrect parsing of '020000000000.0', which
+  produced a ValueError instead of giving the correct float.
+
 - Issue #3242: Fix a crash inside the print statement, if sys.stdout is
   set to a custom object whose write() method happens to install
   another file in sys.stdout.
diff --git a/Python/ast.c b/Python/ast.c
index 057b64df32..434236b307 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -3067,16 +3067,7 @@ parsenumber(const char *s)
 #endif
 	if (*end == 'l' || *end == 'L')
 		return PyLong_FromString((char *)s, (char **)0, 0);
-	if (s[0] == '0') {
-		x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
- 		if (x < 0 && errno == 0) {
-	 			return PyLong_FromString((char *)s,
-							 (char **)0,
-							 0);
-		}
-	}
-	else
-		x = PyOS_strtol((char *)s, (char **)&end, 0);
+	x = PyOS_strtol((char *)s, (char **)&end, 0);
 	if (*end == '\0') {
 		if (errno != 0)
 			return PyLong_FromString((char *)s, (char **)0, 0);