From b820d7f63132c1c6c1f301ee40be2b2729a61356 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Mon, 22 Aug 2016 12:24:46 +0100 Subject: [PATCH] Issue #27792: force int return type for modulo operations involving bools. --- Lib/test/test_bool.py | 7 +++++++ Misc/NEWS | 4 ++++ Objects/longobject.c | 7 +++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py index 5f7e842da2d..9f8f0e122c8 100644 --- a/Lib/test/test_bool.py +++ b/Lib/test/test_bool.py @@ -96,6 +96,13 @@ class BoolTest(unittest.TestCase): self.assertEqual(False/1, 0) self.assertIsNot(False/1, False) + self.assertEqual(True%1, 0) + self.assertIsNot(True%1, False) + self.assertEqual(True%2, 1) + self.assertIsNot(True%2, True) + self.assertEqual(False%1, 0) + self.assertIsNot(False%1, False) + for b in False, True: for i in 0, 1, 2: self.assertEqual(b**i, int(b)**i) diff --git a/Misc/NEWS b/Misc/NEWS index ff677e008ed..cbbb4242e49 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 3.6.0 beta 1 Core and Builtins ----------------- +- Issue #27792: The modulo operation applied to ``bool`` and other + ``int`` subclasses now always returns an ``int``. Previously + the return type depended on the input values. Patch by Xiang Zhang. + - Issue #26984: int() now always returns an instance of exact int. - Issue #25604: Fix a minor bug in integer true division; this bug could diff --git a/Objects/longobject.c b/Objects/longobject.c index 5b9bc67a48d..38e707220a2 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -2458,8 +2458,11 @@ long_divrem(PyLongObject *a, PyLongObject *b, *pdiv = (PyLongObject*)PyLong_FromLong(0); if (*pdiv == NULL) return -1; - Py_INCREF(a); - *prem = (PyLongObject *) a; + *prem = (PyLongObject *)long_long((PyObject *)a); + if (*prem == NULL) { + Py_CLEAR(*pdiv); + return -1; + } return 0; } if (size_b == 1) {