From: "charliesome (Charlie Somerville)" Date: 2012-12-09T12:16:00+09:00 Subject: [ruby-core:50703] [ruby-trunk - Bug #7522] Non-core "Type()" Kernel methods return new objects Issue #7522 has been updated by charliesome (Charlie Somerville). Your change to ext/bigdecimal/bigdecimal.c will cause a compiler warning: compiling bigdecimal.c bigdecimal.c: In function ���BigDecimal_global_new���: bigdecimal.c:2414: warning: ISO C90 forbids mixed declarations and code You should move the declaration of 'pv' above the your if statement, but leave the assignment where it is. ---------------------------------------- Bug #7522: Non-core "Type()" Kernel methods return new objects https://bugs.ruby-lang.org/issues/7522#change-34549 Author: jballanc (Joshua Ballanco) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: 2.0.0-preview1 The methods Array(), String(), Float(), Integer(), Hash(), and Rational() all return their argument when the argument is already an instance of the type in question. For example: a = [] a.equal? Array(a) #=> true However, the similar methods Pathname(), BigDecimal(), and Complex() do not do this: p = Pathname.new('/tmp') p.equal? Pathname(p) #=> false I had the impression that the "Type()" methods were intended as "safe" coercion methods. That is, if no type conversion is required, then the system is left unchanged (and no new objects are created). The attached patch fixes the three methods mentioned above to adhere to this same invariant. -- http://bugs.ruby-lang.org/