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.
  • [Bug analyzer/96713] [11 Regres... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to