From 80fcfebca8c62ace6cf2af9487784486af07d2d5 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Wed, 26 Jun 2024 22:38:01 +1000 Subject: [PATCH] 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. --- src/regex_impl.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/regex_impl.cc b/src/regex_impl.cc index 34cd104a1..a6298dc7f 100644 --- a/src/regex_impl.cc +++ b/src/regex_impl.cc @@ -753,7 +753,10 @@ private: { auto node = compile_node(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);