self.assertEqual(dt.utcoffset(), offset.utcoffset, dt)
self.assertEqual(dt.dst(), offset.dst, dt)
+ def test_datetime_subclass_negative_components(self):
+ class MinusOneDateTime(datetime):
+ hour = minute = second = -1
+
+ zi = self.zone_from_key("UTC")
+ dt = MinusOneDateTime(2024, 1, 1, tzinfo=zi)
+
+ self.assertEqual(dt.utcoffset(), ZERO)
+ self.assertEqual(dt.dst(), ZERO)
+ self.assertEqual(dt.tzname(), "UTC")
+ self.assertEqual(zi.fromutc(dt), datetime(2024, 1, 1, tzinfo=zi))
+
def test_folds_and_gaps(self):
test_cases = []
for key in self.zones():
--- /dev/null
+Fix a bug in the C accelerator for :mod:`zoneinfo` where
+:class:`datetime.datetime` subclasses returning ``-1`` for ``hour``,
+``minute``, or ``second`` could incorrectly raise a :exc:`SystemError`.
}
hour = PyLong_AsLong(num);
Py_DECREF(num);
- if (hour == -1) {
+ if (hour == -1 && PyErr_Occurred()) {
return -1;
}
}
minute = PyLong_AsLong(num);
Py_DECREF(num);
- if (minute == -1) {
+ if (minute == -1 && PyErr_Occurred()) {
return -1;
}
}
second = PyLong_AsLong(num);
Py_DECREF(num);
- if (second == -1) {
+ if (second == -1 && PyErr_Occurred()) {
return -1;
}
}