diff -r ae76a1046bb9 Lib/calendar.py --- a/Lib/calendar.py Wed Mar 16 14:30:16 2016 +0100 +++ b/Lib/calendar.py Sun Mar 27 12:34:25 2016 +0200 @@ -159,7 +159,10 @@ date = datetime.date(year, month, 1) # Go back to the beginning of the week days = (date.weekday() - self.firstweekday) % 7 - date -= datetime.timedelta(days=days) + try: + date -= datetime.timedelta(days=days) + except OverflowError: + pass oneday = datetime.timedelta(days=1) while True: yield date diff -r ae76a1046bb9 Lib/test/test_calendar.py --- a/Lib/test/test_calendar.py Wed Mar 16 14:30:16 2016 +0100 +++ b/Lib/test/test_calendar.py Sun Mar 27 12:34:25 2016 +0200 @@ -502,6 +502,10 @@ # see #15421 list(calendar.Calendar().itermonthdates(datetime.MAXYEAR, 12)) + def test_itermonthdates_firstweek(self): + # ensure itermonthdates doesn't overflow before year 1 + for i in range(1, 7): + list(calendar.Calendar(i).itermonthdates(1, 1)) class MonthCalendarTestCase(unittest.TestCase): def setUp(self):