diff --git a/compile.c b/compile.c index 80dc5e729a..6351914f7f 100644 --- a/compile.c +++ b/compile.c @@ -6855,21 +6855,26 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in break; } case NODE_CDECL:{ - CHECK(COMPILE(ret, "lvalue", node->nd_value)); - - if (!popped) { - ADD_INSN(ret, line, dup); - } - + ID base_id; if (node->nd_vid) { ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CONST_BASE)); - ADD_INSN1(ret, line, setconstant, ID2SYM(node->nd_vid)); + base_id = node->nd_vid; } else { compile_cpath(ret, iseq, node->nd_else); - ADD_INSN1(ret, line, setconstant, ID2SYM(node->nd_else->nd_mid)); + base_id = node->nd_else->nd_mid; } + CHECK(COMPILE(ret, "lvalue", node->nd_value)); + + if (popped) { + ADD_INSN(ret, line, swap); + } else { + ADD_INSN(ret, line, dup); + ADD_INSN1(ret, line, reverse, INT2FIX(3)); + } + + ADD_INSN1(ret, line, setconstant, ID2SYM(base_id)); break; } case NODE_CVASGN:{ diff --git a/test/ruby/test_const.rb b/test/ruby/test_const.rb index 8784e0e988..fa512aa437 100644 --- a/test/ruby/test_const.rb +++ b/test/ruby/test_const.rb @@ -69,4 +69,12 @@ PRE def test_toplevel_lookup assert_raise(NameError, '[Feature #11547]') {TestConst::Object} end + + def test_evaluation_order + assert_raise_with_message(RuntimeError, "recv", 'JIS X 3017:2013 11.4.2.2.3') { + eval <<~EOS + raise('recv')::C = raise('value') + EOS + } + end end