summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-31 11:01:59 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-09-02 14:33:23 +0900
commit9212d963070612e669c40e5fde7954f19d648002 (patch)
treeedffc38b5c9350989e767fcb0059bf04203c9f1d
parenta9b59e24f49f669f6ad2f3238c4c518027a7f72d (diff)
[Bug #18937] Coerce non-real non-Numeric into Complex at comparisons
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/6317
-rw-r--r--complex.c16
-rw-r--r--test/ruby/test_complex.rb10
2 files changed, 19 insertions, 7 deletions
diff --git a/complex.c b/complex.c
index 1feafa370b..7d45b445db 100644
--- a/complex.c
+++ b/complex.c
@@ -1124,15 +1124,23 @@ nucomp_cmp(VALUE self, VALUE other)
if (!k_numeric_p(other)) {
return rb_num_coerce_cmp(self, other, idCmp);
}
- if (nucomp_real_p(self)) {
- if (RB_TYPE_P(other, T_COMPLEX) && nucomp_real_p(other)) {
+ if (!nucomp_real_p(self)) {
+ return Qnil;
+ }
+ if (RB_TYPE_P(other, T_COMPLEX)) {
+ if (nucomp_real_p(other)) {
get_dat2(self, other);
return rb_funcall(adat->real, idCmp, 1, bdat->real);
}
- else if (f_real_p(other)) {
- get_dat1(self);
+ }
+ else {
+ get_dat1(self);
+ if (f_real_p(other)) {
return rb_funcall(dat->real, idCmp, 1, other);
}
+ else {
+ return rb_num_coerce_cmp(dat->real, other, idCmp);
+ }
}
return Qnil;
}
diff --git a/test/ruby/test_complex.rb b/test/ruby/test_complex.rb
index f85bf101e0..13511fd4cf 100644
--- a/test/ruby/test_complex.rb
+++ b/test/ruby/test_complex.rb
@@ -568,19 +568,23 @@ class Complex_Test < Test::Unit::TestCase
end
class ObjectX
- def +(x) Rational(1) end
+ def initialize(real = true, n = 1) @n = n; @real = real; end
+ def +(x) Rational(@n) end
alias - +
alias * +
alias / +
alias quo +
alias ** +
- def coerce(x) [x, Complex(1)] end
+ def coerce(x) [x, Complex(@n)] end
+ def real?; @real; end
end
def test_coerce2
x = ObjectX.new
+ y = ObjectX.new(false)
%w(+ - * / quo ** <=>).each do |op|
- assert_kind_of(Numeric, Complex(1).__send__(op, x))
+ assert_kind_of(Numeric, Complex(1).__send__(op, x), op)
+ assert_kind_of(Numeric, Complex(1).__send__(op, y), op)
end
end