Fix off-by-one bug in iso_week::year_lastweek_weekday

* The conversion from year_lastweek_weekday to sys_days
  and local_days had an off by one error.
* Added test for this case.
This commit is contained in:
Howard Hinnant
2017-11-30 10:28:14 -05:00
parent 87ed7f83cf
commit c513a20691
2 changed files with 13 additions and 2 deletions

View File

@@ -1314,7 +1314,7 @@ inline
year_lastweek_weekday::operator sys_days() const NOEXCEPT
{
return sys_days(date::year{static_cast<int>(y_)}/date::dec/date::thu[date::last])
+ (mon - thu) - (mon - wd_);
+ (sun - thu) - (sun - wd_);
}
CONSTCD14
@@ -1322,7 +1322,7 @@ inline
year_lastweek_weekday::operator local_days() const NOEXCEPT
{
return local_days(date::year{static_cast<int>(y_)}/date::dec/date::thu[date::last])
+ (mon - thu) - (mon - wd_);
+ (sun - thu) - (sun - wd_);
}
CONSTCD11

View File

@@ -115,4 +115,15 @@ main()
std::ostringstream os;
os << x0;
assert(os.str() == "2015-W last-Tue");
for (auto y = 1950_y; y <= 2050_y; ++y)
{
auto wd = mon;
do
{
auto x = y/last/wd;
assert(date::year_month_day{x} == date::year_month_day{year_weeknum_weekday{x}});
++wd;
} while (wd != mon);
}
}