From 5ac862362900773fb95a8c9ab58fe49721e8cd92 Mon Sep 17 00:00:00 2001 From: Yuanhong Zhao Date: Fri, 2 Jul 2021 23:36:43 -0700 Subject: [PATCH 1/4] LWG-3536: leave duration unchanged on failed parse --- stl/inc/chrono | 1 - .../std/tests/P0355R7_calendars_and_time_zones_io/test.cpp | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/stl/inc/chrono b/stl/inc/chrono index 09c8dad9aee..3c289f4d781 100644 --- a/stl/inc/chrono +++ b/stl/inc/chrono @@ -4137,7 +4137,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..7c71419cc7a 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 @@ -262,6 +262,12 @@ void parse_seconds() { fail_parse("1.2 1.3", "%S %S", time_ms); fail_parse("1.2 2.2", "%S %S", time_ms); + + // LWG-3536, failed parse leaves duration unmodified. + minutes mm{20}; + istringstream iss{"2:2:20"}; + iss >> parse(string{"%H:%M:%S"}, mm); + assert(iss.fail() && mm == 20min); } void parse_minutes() { From 1abd9cec59584b7cbf7dad08ab0b2c2f4fb9e2aa Mon Sep 17 00:00:00 2001 From: Yuanhong Zhao Date: Wed, 4 Aug 2021 14:20:11 -0700 Subject: [PATCH 2/4] code review feedback --- .../test.cpp | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) 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 7c71419cc7a..288eb5f96d2 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:20"}; + 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); @@ -263,11 +286,7 @@ void parse_seconds() { fail_parse("1.2 1.3", "%S %S", time_ms); fail_parse("1.2 2.2", "%S %S", time_ms); - // LWG-3536, failed parse leaves duration unmodified. - minutes mm{20}; - istringstream iss{"2:2:20"}; - iss >> parse(string{"%H:%M:%S"}, mm); - assert(iss.fail() && mm == 20min); + test_lwg_3536(); } void parse_minutes() { From 5d552790a2b1b78daa1a6267b3e259faa7f4ca76 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 13 Aug 2021 16:28:36 -0700 Subject: [PATCH 3/4] Parse "2:2:30" so 20 can be a unique value. --- tests/std/tests/P0355R7_calendars_and_time_zones_io/test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 288eb5f96d2..a993214de0c 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 @@ -226,7 +226,7 @@ void test_lwg_3536() { minutes mm{20}; { - istringstream iss{"2:2:20"}; + istringstream iss{"2:2:30"}; iss >> parse(string{"%H:%M:%S"}, mm); assert(iss.fail() && mm == 20min); } From 32d30dedae6b72b6760a2220505e1e67c1b5d45e Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 13 Aug 2021 16:44:08 -0700 Subject: [PATCH 4/4] Call test_lwg_3536() in test_parse(). --- tests/std/tests/P0355R7_calendars_and_time_zones_io/test.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 a993214de0c..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 @@ -285,8 +285,6 @@ void parse_seconds() { fail_parse("1.2 1.3", "%S %S", time_ms); fail_parse("1.2 2.2", "%S %S", time_ms); - - test_lwg_3536(); } void parse_minutes() { @@ -1207,6 +1205,7 @@ void parse_wchar() { } void test_parse() { + test_lwg_3536(); parse_seconds(); parse_minutes(); parse_hours();