https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126543
Bug ID: 126543
Summary: chrono::parse does not reject "60" seconds for a
non-leap second
Product: gcc
Version: 16.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
#include <chrono>
#include <sstream>
#include <assert.h>
int main()
{
std::istringstream in;
std::chrono::utc_seconds ut;
std::chrono::sys_seconds st;
in.str("2016-12-31 23:59:60");
in >> parse("%F %T", ut);
assert(in.good()); // is a leap second
in.str("2016-12-31 23:59:60");
in >> parse("%F %T", st);
assert(in.fail()); // can't read leap seconds into sys_time
in.clear();
in.str("2016-12-31 23:58:60");
in >> parse("%F %T", ut);
assert(in.fail()); // not a leap second
in.clear();
}
The last assertion fails, because we allow ":60" for any utc_time, but we
should verify that the parsed time really was a leap second.
"2016-12-31 23:59:60" is valid
"2016-12-31 23:58:60" is not (a leap second can only occur in the last second
of December or the last second of June).