Issue #15780 has been updated by Eregon (Benoit Daloze).


I can confirm the bug. Here is a single-line reproducer:
```
$ ruby -e 'autoload :X, "foo"; p Object.const_defined?("X")'
Traceback (most recent call last):
	3: from -e:1:in `<main>'
	2: from -e:1:in `const_defined?'
	1: from /home/eregon/.rubies/ruby-2.6.2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/home/eregon/.rubies/ruby-2.6.2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- foo (LoadError)
```

FWIW, `const_defined?("A::B")` needs to resolve A to know if it has a B constant, but the last component (B or X) should not trigger any autoload.

----------------------------------------
Bug #15780: Module#const_defined?(String) executes autoloads
https://bugs.ruby-lang.org/issues/15780#change-77745

* Author: fxn (Xavier Noria)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
The documentation of `Module#const_defined?` says that autoloads are not executed:

> [...] if the constant is not present but there is an autoload for it, true is returned directly without autoloading.

While this seems to work as documented for symbols, constant names passed as strings trigger the autoload:

```
$ cat x.rb
p X = 1

$ cat foo.rb
Object.autoload("X", "x")
p Object.const_defined?("X")

$ ruby -I. foo.rb
1
true
```



-- 
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>