From ef751252711ca7ecabb3e4ad9214fa0d1d63608a Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 10 Jan 2024 13:07:34 -0800 Subject: [PATCH] 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] --- compile.c | 1 + test/ruby/test_defined.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+) 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))