@@ -1004,10 +1004,11 @@ struct bracket_expression : terminal_encoder_expression_interface<bracket_expres
1004
1004
[[nodiscard]] unicode::rune_set make_rune_set (directives mode) const
1005
1005
{
1006
1006
unicode::rune_set result;
1007
- std::optional<char32_t > left_rune;
1007
+ bool circumflex{false };
1008
+ bool left_rune_present{false };
1009
+ char32_t left_rune{U' \0 ' };
1008
1010
auto curr = pattern.begin ();
1009
1011
auto const last = pattern.end ();
1010
- bool circumflex{false };
1011
1012
if ((curr != last) && (*curr == ' ^' )) {
1012
1013
circumflex = true ;
1013
1014
++curr;
@@ -1018,20 +1019,22 @@ struct bracket_expression : terminal_encoder_expression_interface<bracket_expres
1018
1019
auto const [next, next_rune] = utf8::decode_rune (curr, last);
1019
1020
if ((next_rune == U' -' ) && (next != last)) {
1020
1021
auto const [right, right_rune] = utf8::decode_rune (next, last);
1021
- if (!left_rune. has_value () )
1022
+ if (!left_rune_present )
1022
1023
throw bad_character_range{};
1023
- add_rune_range (std::ref (result), mode, *left_rune, right_rune);
1024
- left_rune = std::nullopt;
1024
+ add_rune_range (std::ref (result), mode, left_rune, right_rune);
1025
+ left_rune = U' \0 ' ;
1026
+ left_rune_present = false ;
1025
1027
curr = right;
1026
1028
} else {
1027
- if (left_rune. has_value () )
1028
- add_rune_range (std::ref (result), mode, * left_rune, * left_rune);
1029
+ if (left_rune_present )
1030
+ add_rune_range (std::ref (result), mode, left_rune, left_rune);
1029
1031
left_rune = next_rune;
1032
+ left_rune_present = true ;
1030
1033
curr = next;
1031
1034
}
1032
1035
}
1033
- if (left_rune. has_value () )
1034
- add_rune_range (std::ref (result), mode, * left_rune, * left_rune);
1036
+ if (left_rune_present )
1037
+ add_rune_range (std::ref (result), mode, left_rune, left_rune);
1035
1038
result = unicode::sort_and_optimize (std::move (result));
1036
1039
if (circumflex)
1037
1040
result = unicode::negate (result);
0 commit comments