diff --git a/stl/inc/xloctime b/stl/inc/xloctime index 15036ae8d77..2ad449c4799 100644 --- a/stl/inc/xloctime +++ b/stl/inc/xloctime @@ -572,6 +572,14 @@ protected: } break; + case '%': + if (_First == _Last || _Ctype_fac.narrow(*_First) != '%') { + _State |= ios_base::failbit; + } else { + ++_First; + } + break; + default: _State |= ios_base::failbit; // unknown specifier break; diff --git a/tests/std/tests/Dev11_0836436_get_time/test.cpp b/tests/std/tests/Dev11_0836436_get_time/test.cpp index ff7a8be5b97..56666164855 100644 --- a/tests/std/tests/Dev11_0836436_get_time/test.cpp +++ b/tests/std/tests/Dev11_0836436_get_time/test.cpp @@ -112,6 +112,7 @@ void test_gh_2618(); void test_gh_2848(); void test_gh_4820(); void test_gh_4882(); +void test_gh_6130(); int main() { assert(read_hour("12 AM") == 0); @@ -160,6 +161,7 @@ int main() { test_gh_2848(); test_gh_4820(); test_gh_4882(); + test_gh_6130(); } typedef istreambuf_iterator Iter; @@ -961,3 +963,20 @@ void test_gh_4882() { fieldValidation(testData.field, testData.hi, testData.fmt); } } + +void test_gh_6130() { + // GH-6130 : time_get::do_get doesn't parse a literal % + { + tm t{}; + stringstream ss{"%"}; + ss >> get_time(&t, "%%"); + assert(!ss.fail() && ss.eof()); + } + + { + tm t{}; + stringstream ss{"% "}; + ss >> get_time(&t, "%%"); + assert(!ss.fail() && ss.tellg() == 1); + } +}