[Bug libstdc++/94345] New: std::chrono overflows due to c++14 non-compliance
jaapaap at freemail dot hu
gcc-bugzilla@gcc.gnu.org
Thu Mar 26 16:41:36 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94345
Bug ID: 94345
Summary: std::chrono overflows due to c++14 non-compliance
Product: gcc
Version: 9.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: jaapaap at freemail dot hu
Target Milestone: ---
The code below does not compile, as the introduction of operator+(const years&
x, const year& y) into the overload set causes the instantiation of the
chrono::duration converting constructor that tries to convert picoseconds to
years. Since C++14 this constructor has been specified to not participate in
overload resolution unless the conversion (factor) does not cause overflow (The
overflow clause was absent in C++11). It seems GCC hasn't implemented the
overflow clause. Thanks and credits go to Howard Hinnant for identifying this
during my discussion with him here:
https://gitter.im/HowardHinnant/date?at=5cb306ffa0790b29c9b4d3fd and who
provided the standalone minimum test case below.
#include <chrono>
namespace date {
using days = std::chrono::duration
<int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;
using weeks = std::chrono::duration
<int, std::ratio_multiply<std::ratio<7>, days::period>>;
using years = std::chrono::duration
<int, std::ratio_multiply<std::ratio<146097, 400>, days::period>>;
class year
{
};
constexpr year operator+(const years& x, const year& y) noexcept;
} // namespace date
void this_compiles()
{
using TDuration = std::chrono::duration<int64_t, std::nano>;
TDuration d1, d2;
using namespace date;
TDuration d3 = d1 + d2;
}
void this_does_not_compile()
{
using TDuration = std::chrono::duration<__int128_t, std::pico>;
TDuration d1, d2;
using namespace date; // removing this line makes it compile
TDuration d3 = d1 + d2; // does not compile
}
int
main()
{
}
More information about the Gcc-bugs
mailing list