Skip to content

Commit

Permalink
ICU-22750 Fix Floating-point-exception in icu::Calendar::roll
Browse files Browse the repository at this point in the history
See #2979
  • Loading branch information
FrankYFTang committed Apr 23, 2024
1 parent 0312308 commit a91cbd6
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 0 deletions.
3 changes: 3 additions & 0 deletions icu4c/source/i18n/calendar.cpp
Expand Up @@ -1762,6 +1762,9 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu
{
int32_t min = getActualMinimum(field,status);
int32_t max = getActualMaximum(field,status);
if (U_FAILURE(status)) {
return;
}
int32_t gap = max - min + 1;

int64_t value = internalGet(field);
Expand Down
20 changes: 20 additions & 0 deletions icu4c/source/test/intltest/caltest.cpp
Expand Up @@ -209,6 +209,7 @@ void CalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &name,

TESTCASE_AUTO(TestAddOverflow);

TESTCASE_AUTO(Test22750Roll);

TESTCASE_AUTO(TestChineseCalendarComputeMonthStart);

Expand Down Expand Up @@ -5929,6 +5930,25 @@ void CalendarTest::TestAddOverflow() {
}
}
}

void CalendarTest::Test22750Roll() {
UErrorCode status = U_ZERO_ERROR;
Locale l(Locale::getRoot());
std::unique_ptr<icu::StringEnumeration> enumeration(
Calendar::getKeywordValuesForLocale("calendar", l, false, status));
// Test every calendar
for (const char* name = enumeration->next(nullptr, status);
U_SUCCESS(status) && name != nullptr;
name = enumeration->next(nullptr, status)) {
UErrorCode status2 = U_ZERO_ERROR;
l.setKeywordValue("calendar", name, status2);
LocalPointer<Calendar> calendar(Calendar::createInstance(l, status2));
if (failure(status2, "Calendar::createInstance")) return;
calendar->add(UCAL_DAY_OF_WEEK_IN_MONTH, 538976288, status2);
calendar->roll(UCAL_DATE, 538976288, status2);
}
}

#endif /* #if !UCONFIG_NO_FORMATTING */

//eof
3 changes: 3 additions & 0 deletions icu4c/source/test/intltest/caltest.h
Expand Up @@ -347,6 +347,9 @@ class CalendarTest: public CalendarTimeZoneTest {
void Test22633AddTwiceGetTimeOverflow();
void Test22633RollTwiceGetTimeOverflow();
void Test22730JapaneseOverflow();

void Test22750Roll();

void RunTestOnCalendars(void(TestFunc)(Calendar*, UCalendarDateFields));

void verifyFirstDayOfWeek(const char* locale, UCalendarDaysOfWeek expected);
Expand Down

0 comments on commit a91cbd6

Please sign in to comment.