diff --git a/prism_compile.c b/prism_compile.c index f5648381bb..abfcab10ab 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3583,12 +3583,13 @@ pm_compile_rescue(rb_iseq_t *iseq, pm_begin_node_t *begin_node, LINK_ANCHOR *con } ISEQ_COMPILE_DATA(iseq)->in_rescue = prev_in_rescue; + ADD_LABEL(ret, lend); + if (begin_node->else_clause) { PM_POP_UNLESS_POPPED; PM_COMPILE((pm_node_t *)begin_node->else_clause); } - ADD_LABEL(ret, lend); PM_NOP; ADD_LABEL(ret, lcont); diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index e4748e3898..d004eb9ce7 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -1395,6 +1395,23 @@ a end end CODE + + # Test RescueNode with ElseNode + assert_prism_eval(<<~RUBY) + calls = [] + begin + begin + rescue RuntimeError + calls << 1 + else + calls << 2 + raise RuntimeError + end + rescue RuntimeError + end + + calls + RUBY end def test_RescueModifierNode