bpo-39871: Fix possible SystemError in atan2, copysign and remainder (GH-18806)

In math_2(), the first PyFloat_AsDouble() call should be checked
for failure before the second call.

Co-authored-by: Mark Dickinson <dickinsm@gmail.com>
This commit is contained in:
Zackery Spytz 2020-03-14 04:45:32 -06:00 committed by GitHub
parent 3a8c56295d
commit 5208b4b379
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 2 deletions

View file

@ -1992,6 +1992,22 @@ class MathTests(unittest.TestCase):
with self.subTest(x=x):
self.assertEqual(math.ulp(-x), math.ulp(x))
def test_issue39871(self):
# A SystemError should not be raised if the first arg to atan2(),
# copysign(), or remainder() cannot be converted to a float.
class F:
def __float__(self):
self.converted = True
1/0
for func in math.atan2, math.copysign, math.remainder:
y = F()
with self.assertRaises(TypeError):
func("not a number", y)
# There should not have been any attempt to convert the second
# argument to a float.
self.assertFalse(getattr(y, "converted", False))
# Custom assertions.
def assertIsNaN(self, value):