Issue #9275 has been updated by Yui NARUSE.

Status changed from Assigned to Closed

Applied in changeset r44683.

----------
merge revision(s) 44358,44359,44360,44363: [Backport #9275]

        hash.c: reword

        * hash.c (HAS_EXTRA_STATES, rb_hash_reject): use words "extra states".
        * hash.c (HAS_EXTRA_STATES): warn extra states only when something
          differ.  [ruby-core:59254] [Bug #9275]

----------------------------------------
Backport #9275: Class.new(Hash)#reject warning is confusing and is issued in situations where I don't think it should be
https://bugs.ruby-lang.org/issues/9275#change-44529

* Author: Myron Marston
* Status: Closed
* Priority: Normal
* Assignee: Yui NARUSE
* Category: 
* Target version: 
* ruby -v: ruby 2.1.0dev (2013-12-20 trunk 44301) [x86_64-darwin12.0]
----------------------------------------
Consider this script:

```
$VERBOSE = true
Class.new(Hash).new.reject { }
```

When I run this with 2.1.0-rc1, I get the following output:

```
foo.rb:2: warning: copying unguaranteed attributes: {}
foo.rb:2: warning: following atributes will not be copied in the future version:
foo.rb:2: warning:   subclass: #<Class:0x007f91bb89dda8>
```

This warning is confusing.  I've been using ruby full time for ~ 5 years and I have no idea what "unguaranteed attributes" means.  In addition, I don't think this warning should be issued in this case at all.  According to [the NEWS entry](https://github.com/ruby/ruby/blob/9881a183bde20d1c174d33d8a2f637e9c092a08b/NEWS#L136-L141) and #9223, this warning is intended for cases where there is extra state (instance variables, default proc, etc) that will not be copied in the future...but in this case, it's a subclass of Hash with no extra state or behavior.  Why should it warn in this case?

As things stand now, if you want to have a warning-free gem, you can no longer subclass hash if you call #`reject` on it or expose it as part of your public API (as end users may call #`reject` on it).




-- 
http://bugs.ruby-lang.org/