diff -r a3c9c2c92b87 Lib/test/test_descr.py --- a/Lib/test/test_descr.py Fri Mar 20 20:04:21 2015 +0200 +++ b/Lib/test/test_descr.py Fri Mar 20 16:21:27 2015 -0400 @@ -3020,8 +3020,6 @@ cant(object(), list) cant(list(), object) class Int(int): __slots__ = [] - cant(2, Int) - cant(Int(), int) cant(True, int) cant(2, bool) o = object() diff -r a3c9c2c92b87 Lib/test/test_gc.py --- a/Lib/test/test_gc.py Fri Mar 20 20:04:21 2015 +0200 +++ b/Lib/test/test_gc.py Fri Mar 20 16:21:27 2015 -0400 @@ -3,6 +3,7 @@ strip_python_stderr, cpython_only) from test.script_helper import assert_python_ok, make_script, temp_dir +import array import sys import time import gc @@ -550,11 +551,28 @@ class UserClass: pass + + class UserInt(int): + pass + + class UserClassSlots: + __slots__ = () + + class UserIntSlots(int): + __slots__ = () + + class UserArraySlots(array.array): + __slots__ = () + self.assertTrue(gc.is_tracked(gc)) self.assertTrue(gc.is_tracked(UserClass)) self.assertTrue(gc.is_tracked(UserClass())) + self.assertTrue(gc.is_tracked(UserInt())) self.assertTrue(gc.is_tracked([])) self.assertTrue(gc.is_tracked(set())) + self.assertFalse(gc.is_tracked(UserClassSlots())) + self.assertFalse(gc.is_tracked(UserIntSlots())) + self.assertFalse(gc.is_tracked(UserArraySlots('i'))) def test_bug1055820b(self): # Corresponds to temp2b.py in the bug report. diff -r a3c9c2c92b87 Objects/typeobject.c --- a/Objects/typeobject.c Fri Mar 20 20:04:21 2015 +0200 +++ b/Objects/typeobject.c Fri Mar 20 16:21:27 2015 -0400 @@ -2645,9 +2645,10 @@ } type->tp_dealloc = subtype_dealloc; - /* Enable GC unless there are really no instance variables possible */ - if (!(type->tp_basicsize == sizeof(PyObject) && - type->tp_itemsize == 0)) + /* Enable GC unless this class is not adding new instance variables and + the base class did not use GC. */ + if ((base->tp_flags & Py_TPFLAGS_HAVE_GC) || + type->tp_basicsize > base->tp_basicsize) type->tp_flags |= Py_TPFLAGS_HAVE_GC; /* Always override allocation strategy to use regular heap */