diff --git a/libs/iovm/source/IoDate.c b/libs/iovm/source/IoDate.c index cc7062d02..8ca715512 100644 --- a/libs/iovm/source/IoDate.c +++ b/libs/iovm/source/IoDate.c @@ -275,7 +275,7 @@ IO_METHOD(IoDate, setDay) { } else { IOASSERT(v >= 1 && v <= 28, "day must be within range 1-28"); } - } else if (month == 11) { + } else if (month == 4 || month == 6 || month == 9 || month == 11) { IOASSERT(v >= 1 && v <= 30, "day must be within range 1-30"); } else if (month == 12) { IOASSERT(v >= 1 && v <= 31, "day must be within range 1-31"); diff --git a/libs/iovm/tests/correctness/DateTest.io b/libs/iovm/tests/correctness/DateTest.io index ddef2048f..6897efe36 100644 --- a/libs/iovm/tests/correctness/DateTest.io +++ b/libs/iovm/tests/correctness/DateTest.io @@ -79,5 +79,16 @@ DateTest := UnitTest clone do( //testString("%x") #%x is locale dependent testString("%y") ) + + // Regression: setDay must reject day 31 in 30-day months (Apr/Jun/Sep/Nov). + // Previously only November was checked; April/June/September could accept 31 incorrectly. + testSetDayThirtyDayMonths := method( + assertRaisesException(Date clone setMonth(4) setDay(31)) + assertRaisesException(Date clone setMonth(6) setDay(31)) + assertRaisesException(Date clone setMonth(9) setDay(31)) + assertRaisesException(Date clone setMonth(11) setDay(31)) + ) ) +if(isLaunchScript, DateTest run, DateTest) +