summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <[email protected]>2024-01-10 13:07:34 -0800
committerJeremy Evans <[email protected]>2024-01-10 16:02:38 -0800
commitef751252711ca7ecabb3e4ad9214fa0d1d63608a (patch)
treed9c62a3c8ca06c2b9c983b7b49e24ee6d849ac60
parent25f5b83689fc6dd137d45b634a0cd6e8bd024728 (diff)
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]
-rw-r--r--compile.c1
-rw-r--r--test/ruby/test_defined.rb12
2 files changed, 13 insertions, 0 deletions
diff --git a/compile.c b/compile.c
index 3822646c0e..6e0456af35 100644
--- a/compile.c
+++ b/compile.c
@@ -5951,6 +5951,7 @@ defined_expr0(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
case NODE_IASGN:
case NODE_CDECL:
case NODE_CVASGN:
+ case NODE_OP_CDECL:
expr_type = DEFINED_ASGN;
break;
}
diff --git a/test/ruby/test_defined.rb b/test/ruby/test_defined.rb
index b9bf939394..0505bdada6 100644
--- a/test/ruby/test_defined.rb
+++ b/test/ruby/test_defined.rb
@@ -127,6 +127,18 @@ class TestDefined < Test::Unit::TestCase
assert_equal nil, defined?($2)
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
assert_equal("nil", defined?(nil))
assert_equal("true", defined?(true))