From 613f8e513cf171a335318221b6050d470a1d765f Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sat, 24 Sep 2016 15:26:36 +0100 Subject: [PATCH] Issue #28203: Fix incorrect type in error message from complex(1.0, {2:3}). Patch by Soumya Sharma. --- Lib/test/test_complex.py | 8 ++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Objects/complexobject.c | 23 +++++++++++++++++------ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index 0ef9a7a1098..403ee3bc580 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -326,6 +326,14 @@ class ComplexTest(unittest.TestCase): self.assertRaises(ValueError, complex, "1e1ej") self.assertRaises(ValueError, complex, "1e++1ej") self.assertRaises(ValueError, complex, ")1+2j(") + self.assertRaisesRegex( + TypeError, + "first argument must be a string or a number, not 'dict'", + complex, {1:2}, 1) + self.assertRaisesRegex( + TypeError, + "second argument must be a number, not 'dict'", + complex, 1, {1:2}) # the following three are accepted by Python 2.6 self.assertRaises(ValueError, complex, "1..1j") self.assertRaises(ValueError, complex, "1.11.1j") diff --git a/Misc/ACKS b/Misc/ACKS index f590f6c6a09..ed93e998610 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1349,6 +1349,7 @@ Daniel Shahaf Mark Shannon Ha Shao Richard Shapiro +Soumya Sharma Varun Sharma Daniel Shaulov Vlad Shcherbina diff --git a/Misc/NEWS b/Misc/NEWS index cf97628edf1..8c9dcc36969 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: TBA Core and Builtins ----------------- +- Issue #28203: Fix incorrect type in error message from + ``complex(1.0, {2:3})``. Patch by Soumya Sharma. + - Issue #27955: Fallback on reading /dev/urandom device when the getrandom() syscall fails with EPERM, for example when blocked by SECCOMP. diff --git a/Objects/complexobject.c b/Objects/complexobject.c index a5bfb667c46..d82c5eb9f1e 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -954,18 +954,29 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } nbr = r->ob_type->tp_as_number; - if (i != NULL) - nbi = i->ob_type->tp_as_number; - if (nbr == NULL || nbr->nb_float == NULL || - ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) { + if (nbr == NULL || nbr->nb_float == NULL) { PyErr_Format(PyExc_TypeError, - "complex() argument must be a string or a number, not '%.200s'", - Py_TYPE(r)->tp_name); + "complex() first argument must be a string or a number, " + "not '%.200s'", + Py_TYPE(r)->tp_name); if (own_r) { Py_DECREF(r); } return NULL; } + if (i != NULL) { + nbi = i->ob_type->tp_as_number; + if (nbi == NULL || nbi->nb_float == NULL) { + PyErr_Format(PyExc_TypeError, + "complex() second argument must be a number, " + "not '%.200s'", + Py_TYPE(i)->tp_name); + if (own_r) { + Py_DECREF(r); + } + return NULL; + } + } /* If we get this far, then the "real" and "imag" parts should both be treated as numbers, and the constructor should return a