Make defined? for op asgn expressions to constants use "assignment"

Previously, it used "expression", as that was the default.  However,
op asgn expressions to constants use the NODE_OP_CDECL, so recognize
that node type as assignement.

Fixes [Bug #20111]
This commit is contained in:
Jeremy Evans 2024-01-10 13:07:34 -08:00
parent 25f5b83689
commit ef75125271
2 changed files with 13 additions and 0 deletions

View File

@ -5951,6 +5951,7 @@ defined_expr0(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
case NODE_IASGN: case NODE_IASGN:
case NODE_CDECL: case NODE_CDECL:
case NODE_CVASGN: case NODE_CVASGN:
case NODE_OP_CDECL:
expr_type = DEFINED_ASGN; expr_type = DEFINED_ASGN;
break; break;
} }

View File

@ -127,6 +127,18 @@ class TestDefined < Test::Unit::TestCase
assert_equal nil, defined?($2) assert_equal nil, defined?($2)
end end
def test_defined_assignment
assert_equal("assignment", defined?(a = 1))
assert_equal("assignment", defined?(a += 1))
assert_equal("assignment", defined?(a &&= 1))
assert_equal("assignment", eval('defined?(A = 1)'))
assert_equal("assignment", eval('defined?(A += 1)'))
assert_equal("assignment", eval('defined?(A &&= 1)'))
assert_equal("assignment", eval('defined?(A::B = 1)'))
assert_equal("assignment", eval('defined?(A::B += 1)'))
assert_equal("assignment", eval('defined?(A::B &&= 1)'))
end
def test_defined_literal def test_defined_literal
assert_equal("nil", defined?(nil)) assert_equal("nil", defined?(nil))
assert_equal("true", defined?(true)) assert_equal("true", defined?(true))