Issue #14469 has been updated by nagachika (Tomoyuki Chikanaga).

Backport changed from 2.3: REQUIRED, 2.4: REQUIRED, 2.5: DONE to 2.3: REQUIRED, 2.4: DONE, 2.5: DONE

ruby_2_4 r62916 merged revision(s) 62394,62395.

----------------------------------------
Bug #14469: private_constant and deprecate_constant are ignored by autoloading
https://bugs.ruby-lang.org/issues/14469#change-71200

* Author: nobu (Nobuyoshi Nakada)
* Status: Closed
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 2.0 or later
* Backport: 2.3: REQUIRED, 2.4: DONE, 2.5: DONE
----------------------------------------
Consider the following code in file "zzz.rb":

```ruby
class ZZZ
  P = D = 1
  private_constant :P
  deprecate_constant :D
end
```

After loading the file, accesses to `ZZZ::P` and `ZZZ:D` cause an exception and a warning respectively.

```
$ ruby -r./zzz -e ZZZ::P
Traceback (most recent call last):
-e:1:in `<main>': private constant ZZZ::P referenced (NameError)
```
```
$ ruby -r./zzz -e ZZZ::D
-e:1: warning: constant ZZZ::D is deprecated
```

But autoloading the file nothing happens.

```
$ ruby -e 'class ZZZ;autoload :P,"./zzz.rb";end; ZZZ::P'
```
```
$ ruby -e 'class ZZZ;autoload :D,"./zzz.rb";end; ZZZ::D'
```

After requiring the file in ordinary way, they works.

```
$ ruby -e 'class ZZZ;autoload :P,"./zzz.rb";end; require "./zzz.rb"; ZZZ::P'
Traceback (most recent call last):
-e:1:in `<main>': private constant ZZZ::P referenced (NameError)
```
```
$ ruby -e 'class ZZZ;autoload :D,"./zzz.rb";end; require "./zzz.rb"; ZZZ::D'
-e:1: warning: constant ZZZ::D is deprecated
```



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

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>