[Bug libstdc++/85821] New: Chrono literal operators do not follow the standard declarataions
andreas.molzer at gmx dot de
gcc-bugzilla@gcc.gnu.org
Thu May 17 16:43:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85821
Bug ID: 85821
Summary: Chrono literal operators do not follow the standard
declarataions
Product: gcc
Version: 8.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: andreas.molzer at gmx dot de
Target Milestone: ---
The literal operators provided by std::literals::chrono_literals are missing
their overloads for unsigned long long arguments. They instead provide a
declaration for long double and a non-standard declaration with template
argument list. This silently breaks valid code:
#include <chrono>
int main() {
using namespace std::chrono_literals;
auto time = operator""s(1ull);
}
Name resolution will only find the single matching overload and convert the
argument to long double. This will result in a duration with unspecified
representation, in libstdc++ case a long double. The standard would instead
require the result to be std::chrono::seconds with representation of an
unspecified integral type with a minimum number of bits.
This can have various additional effects, including decltype(time)::max()
returning an invalid result, so that the normally perfectly valid
std::chrono::seconds::rep max = decltype(time)::max()
will result in undefined behaviour due to the long double maximum value not
fitting inside the unsigned long long.
The following code should be rejected because overload resolution should not be
able to determine a best match:
#include <chrono>
int main() {
using namespace std::chrono_literals;
auto time = operator""s(0); // int, no priority for conversion to ull or
ld
}
More information about the Gcc-bugs
mailing list