bpo-40777: Initialize PyDateTime_IsoCalendarDateType.tp_base at run-t… · python/cpython@459acc5
@@ -3325,7 +3325,7 @@ static PyTypeObject PyDateTime_IsoCalendarDateType = {
33253325 .tp_doc = iso_calendar_date__doc__,
33263326 .tp_methods = iso_calendar_date_methods,
33273327 .tp_getset = iso_calendar_date_getset,
3328- .tp_base = &PyTuple_Type,
3328+// .tp_base = &PyTuple_Type, // filled in PyInit__datetime
33293329 .tp_new = iso_calendar_date_new,
33303330};
33313331@@ -4079,7 +4079,7 @@ static PyTypeObject PyDateTime_TimeZoneType = {
40794079timezone_methods, /* tp_methods */
408040800, /* tp_members */
408140810, /* tp_getset */
4082-&PyDateTime_TZInfoType, /* tp_base */
4082+0, /* tp_base; filled in PyInit__datetime */
408340830, /* tp_dict */
408440840, /* tp_descr_get */
408540850, /* tp_descr_set */
@@ -6458,7 +6458,8 @@ static PyTypeObject PyDateTime_DateTimeType = {
64586458datetime_methods, /* tp_methods */
645964590, /* tp_members */
64606460datetime_getset, /* tp_getset */
6461-&PyDateTime_DateType, /* tp_base */
6461+0, /* tp_base; filled in
6462+ PyInit__datetime */
646264630, /* tp_dict */
646364640, /* tp_descr_get */
646464650, /* tp_descr_set */
@@ -6524,6 +6525,12 @@ PyInit__datetime(void)
65246525if (m == NULL)
65256526return NULL;
652665276528+// `&...` is not a constant expression according to a strict reading
6529+// of C standards. Fill tp_base at run-time rather than statically.
6530+// See https://bugs.python.org/issue40777
6531+PyDateTime_IsoCalendarDateType.tp_base = &PyTuple_Type;
6532+PyDateTime_TimeZoneType.tp_base = &PyDateTime_TZInfoType;
6533+PyDateTime_DateTimeType.tp_base = &PyDateTime_DateType;
6527653465286535PyTypeObject *types[] = {
65296536&PyDateTime_DateType,