Commit 81336374 authored by Mark Dickinson's avatar Mark Dickinson

Issue #5211: Complete removal of implicit coercions for the complex

type.  Coercion for arithmetic operations was already removed in
r78280, but that commit didn't remove coercion for rich comparisons.
parent ddac3388
...@@ -115,6 +115,19 @@ class ComplexTest(unittest.TestCase): ...@@ -115,6 +115,19 @@ class ComplexTest(unittest.TestCase):
def test_coerce(self): def test_coerce(self):
self.assertRaises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000) self.assertRaises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000)
def test_no_implicit_coerce(self):
# Python 2.7 removed implicit coercion from the complex type
class A(object):
def __coerce__(self, other):
raise RuntimeError
__hash__ = None
def __cmp__(self, other):
return -1
a = A()
self.assertRaises(TypeError, lambda: a + 2.0j)
self.assertTrue(a < 2.0j)
def test_richcompare(self): def test_richcompare(self):
self.assertRaises(OverflowError, complex.__eq__, 1+1j, 1L<<10000) self.assertRaises(OverflowError, complex.__eq__, 1+1j, 1L<<10000)
self.assertEqual(complex.__lt__(1+1j, None), NotImplemented) self.assertEqual(complex.__lt__(1+1j, None), NotImplemented)
......
...@@ -12,6 +12,10 @@ What's New in Python 2.7 Release Candidate 1? ...@@ -12,6 +12,10 @@ What's New in Python 2.7 Release Candidate 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #5211: Implicit coercion for the complex type is now completely
removed. (Coercion for arithmetic operations was already removed in 2.7
alpha 4, but coercion for rich comparisons was accidentally left in.)
- Issue #3798: Write sys.exit() message to sys.stderr to use stderr encoding - Issue #3798: Write sys.exit() message to sys.stderr to use stderr encoding
and error handler, instead of writing to the C stderr file in utf-8 and error handler, instead of writing to the C stderr file in utf-8
......
...@@ -787,25 +787,8 @@ complex_richcompare(PyObject *v, PyObject *w, int op) ...@@ -787,25 +787,8 @@ complex_richcompare(PyObject *v, PyObject *w, int op)
Py_complex i, j; Py_complex i, j;
PyObject *res; PyObject *res;
c = PyNumber_CoerceEx(&v, &w); TO_COMPLEX(v, i);
if (c < 0) TO_COMPLEX(w, j);
return NULL;
if (c > 0) {
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
/* Make sure both arguments are complex. */
if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Py_DECREF(v);
Py_DECREF(w);
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
i = ((PyComplexObject *)v)->cval;
j = ((PyComplexObject *)w)->cval;
Py_DECREF(v);
Py_DECREF(w);
if (op != Py_EQ && op != Py_NE) { if (op != Py_EQ && op != Py_NE) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment