Skip to content

Commit a5c90c6

Browse files
committed
Refactor make_rune_set in bracket_expression to work around false positive in leak sanitizer.
1 parent b3240f8 commit a5c90c6

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

include/lug/lug.hpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,10 +1004,11 @@ struct bracket_expression : terminal_encoder_expression_interface<bracket_expres
10041004
[[nodiscard]] unicode::rune_set make_rune_set(directives mode) const
10051005
{
10061006
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'};
10081010
auto curr = pattern.begin();
10091011
auto const last = pattern.end();
1010-
bool circumflex{false};
10111012
if ((curr != last) && (*curr == '^')) {
10121013
circumflex = true;
10131014
++curr;
@@ -1018,20 +1019,22 @@ struct bracket_expression : terminal_encoder_expression_interface<bracket_expres
10181019
auto const [next, next_rune] = utf8::decode_rune(curr, last);
10191020
if ((next_rune == U'-') && (next != last)) {
10201021
auto const [right, right_rune] = utf8::decode_rune(next, last);
1021-
if (!left_rune.has_value())
1022+
if (!left_rune_present)
10221023
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;
10251027
curr = right;
10261028
} 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);
10291031
left_rune = next_rune;
1032+
left_rune_present = true;
10301033
curr = next;
10311034
}
10321035
}
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);
10351038
result = unicode::sort_and_optimize(std::move(result));
10361039
if (circumflex)
10371040
result = unicode::negate(result);

0 commit comments

Comments
 (0)