https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96713
--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Patrick Palka <ppa...@gcc.gnu.org>: https://gcc.gnu.org/g:8572edc828f6d1e7c8243f901fe7c96f62a11a8e commit r11-4490-g8572edc828f6d1e7c8243f901fe7c96f62a11a8e Author: Patrick Palka <ppa...@redhat.com> Date: Wed Oct 28 12:28:08 2020 -0400 libstdc++: Fix arithmetic bug in year_month_weekday conversion [PR96713] The conversion function year_month_weekday::operator sys_days computes the offset in days from the first weekday of the month with: days{(index()-1)*7} ^~~~~~~~~~~~~ type 'unsigned' We want the above to yield -7d when index() is 0u, but our 'days' alias is based on long instead of int, so the conversion from unsigned to the underlying type of 'days' instead yields a large positive value. This patch fixes this by casting the result of index() to int so that the initializer is sign-extended in the conversion to long. The added testcase also verifies we do the right thing when index() == 5. libstdc++-v3/ChangeLog: PR libstdc++/96713 * include/std/chrono (year_month_weekday::operator sys_days): Cast the result of index() to int so that the initializer for days{} is sign-extended when it's converted to the underlying type. * testsuite/std/time/year_month_weekday/3.cc: New test.