3604. What is the effect of an invalid value of type syntax_option_type?

Section: 28.6.7.2 [re.regex.construct], 28.6.4.2 [re.synopt] Status: New Submitter: Jonathan Wakely Opened: 2021-09-27 Last modified: 2021-10-14

Priority: 3

View other active issues in [re.regex.construct].

View all other issues in [re.regex.construct].

View all issues with New status.

Discussion:

28.6.4.2 [re.synopt] says:

A valid value of type syntax_option_type shall have at most one of the grammar elements ECMAScript, basic, extended, awk, grep, egrep, set.

But then we never say what happens if an invalid value is used.

What does std::regex(".", std::regex::grep|std::regex::awk) do? Is it undefined? Does it throw?

It seems reasonable for basic_regex constructors to throw if f is not a valid value, i.e. for each non-default constructor:

Throws: regex_error if f is not a valid value, or if […] is not a valid regular expression according to the grammar specified by f.

However, there is no regex_constants::error_code value suitable for this error condition.

Also, the constructors say "Postconditions: flags() returns f." This prevents an implementation from storing f|ECMAScript in flags() if no grammar element is present in f. This seems like an unnecessary restriction, and forces implementations to do extra work to check if the ECMAScript grammar is in use. Arguably, it would even be better to require implementations to set ECMAScript in flags() if no grammar element was set in the flags passed to the constructor. This problem was introduced by LWG 2330.

[2021-10-14; Reflector poll]

Set priority to 3 after reflector poll.

Proposed resolution: