3960. How does chrono::parse handle duplicated data?

Section: 29.13 [time.parse] Status: New Submitter: Jonathan Wakely Opened: 2023-07-28 Last modified: 2023-11-03 18:04:50 UTC

Priority: 3

View other active issues in [time.parse].

View all other issues in [time.parse].

View all issues with New status.


A call to chrono::parse can encounter redundant or contradictory data, e.g.

stringstream("2023 2022") >> chrono::parse("%Y %C%y", yr);
or even simpler:
stringstream("2023 2022") >> chrono::parse("%Y %Y", yr);
These cases can both be successfully parsed, as the input stream contains the expected values in the expected format. But what value will yr have after it returns?

[2023-11-02; Reflector poll]

Set priority to 3 after reflector poll. "Should allow setting failbit if an implementation does detect inconsistent values." "Yes, that's what MSVC does, so the wording needs something like: it is unspecified whether setstate(ios_base::failbit) is called on the basic_istream or whether an unspecified value is assigned to the p argument."

Proposed resolution:

This wording is relative to N4950.

  1. Modify 29.13 [time.parse] as indicated:

    -17- If the from_stream overload fails to parse everything specified by the format string, or if insufficient information is parsed to specify a complete duration, time point, or calendrical data structure, setstate(ios_base::failbit) is called on the basic_istream.

    -?- A format string can contain multiple flags that correspond to the same information, (e.g., "%Y %C%y" or "%R %H:%M"). If such a format string is successfully parsed but the extracted dates or times are not consistent, the value assigned to the tp argument is unspecified.


    chrono::year y; stringstream("1905 1915") >> parse("%Y %C%y", y);
    The value of y is unspecified; y.ok() can be false. — end example]