`<chrono>` LWG-3536: leave duration unchanged on failed parse (#2037)

Co-authored-by: Stephan T. Lavavej <stl@nuwen.net>
This commit is contained in:
yuanhongzhao 2021-08-16 18:17:49 -07:00 коммит произвёл GitHub
Родитель 503823b5ad
Коммит 3c015bda0c
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 24 добавлений и 1 удалений

Просмотреть файл

@ -4096,7 +4096,6 @@ namespace chrono {
_NODISCARD bool _Make_duration(duration<_Rep, _Period>& _Duration_result) {
const bool _Consistent = _Calculate_hour24();
if (_Consistent) {
_Duration_result = duration<_Rep, _Period>::zero(); // TRANSITION: LWG-3536 & GH-1740
return _Apply_duration_fields<_Parse_tp_or_duration::_Duration>(_Duration_result);
}

Просмотреть файл

@ -221,6 +221,29 @@ void test_limits(const char* flag, const IntType min, const IntType max) {
assert(value == TimeType{max});
}
void test_lwg_3536() {
// LWG-3536, "Should chrono::from_stream() assign zero to duration for failure?"
minutes mm{20};
{
istringstream iss{"2:2:30"};
iss >> parse(string{"%H:%M:%S"}, mm);
assert(iss.fail() && mm == 20min);
}
{
istringstream iss{"June"};
iss >> parse(string{"%B"}, mm);
assert(iss.fail() && mm == 20min);
}
{
istringstream iss{""};
iss >> parse(string{"%B"}, mm);
assert(iss.fail() && mm == 20min);
}
}
void parse_seconds() {
seconds time;
test_parse("1", "%S", time);
@ -1182,6 +1205,7 @@ void parse_wchar() {
}
void test_parse() {
test_lwg_3536();
parse_seconds();
parse_minutes();
parse_hours();