diff --git a/stl/inc/chrono b/stl/inc/chrono index accfa24ad56..c547a45338a 100644 --- a/stl/inc/chrono +++ b/stl/inc/chrono @@ -4145,7 +4145,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); } diff --git a/tests/std/tests/P0355R7_calendars_and_time_zones_io/test.cpp b/tests/std/tests/P0355R7_calendars_and_time_zones_io/test.cpp index 947ec200f59..373f7da3536 100644 --- a/tests/std/tests/P0355R7_calendars_and_time_zones_io/test.cpp +++ b/tests/std/tests/P0355R7_calendars_and_time_zones_io/test.cpp @@ -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();