diff options
| author | Maxime Coste <mawww@kakoune.org> | 2024-06-26 22:38:01 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2024-06-26 22:38:01 +1000 |
| commit | 80fcfebca8c62ace6cf2af9487784486af07d2d5 (patch) | |
| tree | 565cca6f97cafdc191f8304b754860b71949b3f5 /src/regex_impl.cc | |
| parent | cbdd200e7341e010ab448028d2fe0a3f0d92b92a (diff) | |
Fix order of evaluation issue when compiling regex alternations
The previous implementation was relying on the left hand side of the
assignement's side effects to be sequenced before the right hand side
evaluation (so --split_pos was expected to have taken place)
This is actually counter to C++17 which guarantees evaluation of the
right hand side of the assignement first. For some reason this is
not the case with GCC on linux.
Diffstat (limited to 'src/regex_impl.cc')
| -rw-r--r-- | src/regex_impl.cc | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/regex_impl.cc b/src/regex_impl.cc index 34cd104a..a6298dc7 100644 --- a/src/regex_impl.cc +++ b/src/regex_impl.cc @@ -753,7 +753,10 @@ private: { auto node = compile_node<direction>(child); if (child != index+1) - m_program.instructions[--split_pos].param.split = CompiledRegex::Param::Split{.offset = offset(node, split_pos), .prioritize_parent = true}; + { + --split_pos; + m_program.instructions[split_pos].param.split = {.offset = offset(node, split_pos), .prioritize_parent = true}; + } if (get_node(child).children_end != end) { auto jump = push_inst(CompiledRegex::Jump); |
