From 1d666ed50f8b4b3779583381882a0b3edd3cff0e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 28 Oct 2021 12:06:34 +0900 Subject: [PATCH] Fix leap day with UTC offset [Bug #18274] `struct vtm::year` is a Ruby integer instance, but not a C integer type. --- test/ruby/test_time.rb | 1 + time.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index fc21c74078..85667e2d1f 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -39,6 +39,7 @@ class TestTime < Test::Unit::TestCase def test_new assert_equal(Time.utc(2000,2,10), Time.new(2000,2,10, 11,0,0, 3600*11)) assert_equal(Time.utc(2000,2,10), Time.new(2000,2,9, 13,0,0, -3600*11)) + assert_equal(Time.utc(2000,2,29,23,0,0), Time.new(2000, 3, 1, 0, 0, 0, 3600)) assert_equal(Time.utc(2000,2,10), Time.new(2000,2,10, 11,0,0, "+11:00")) assert_equal(Rational(1,2), Time.new(2000,2,10, 11,0,5.5, "+11:00").subsec) bug4090 = '[ruby-dev:42631]' diff --git a/time.c b/time.c index fee12d34ff..6fa4047e29 100644 --- a/time.c +++ b/time.c @@ -784,6 +784,7 @@ static const int8_t leap_year_days_in_month[] = { #define days_in_month_of(leap) ((leap) ? leap_year_days_in_month : common_year_days_in_month) #define days_in_month_in(y) days_in_month_of(leap_year_p(y)) +#define days_in_month_in_v(y) days_in_month_of(leap_year_v_p(y)) #define M28(m) \ (m),(m),(m),(m),(m),(m),(m),(m),(m),(m), \ @@ -2033,7 +2034,7 @@ vtm_add_offset(struct vtm *vtm, VALUE off, int sign) vtm->yday = leap_year_v_p(vtm->year) ? 366 : 365; } else if (vtm->mday == 1) { - const int8_t *days_in_month = days_in_month_in(vtm->year); + const int8_t *days_in_month = days_in_month_in_v(vtm->year); vtm->mon--; vtm->mday = days_in_month[vtm->mon-1]; vtm->yday--;