summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_bool.py7
-rw-r--r--Misc/NEWS4
-rw-r--r--Objects/longobject.c7
3 files changed, 16 insertions, 2 deletions
diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py
index 5f7e842..9f8f0e1 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 ff677e0..cbbb424 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 5b9bc67..38e7072 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) {