
Issue #21026 has been updated by Earlopain (Earlopain _). Interesting! I didn't realize that `__FILE__` will **always** (without frozen string literals) return a new instance. Of course `__LINE__` will always have a different values but the seemingly const-ness of `__FILE__` had me a bit tricked. ---------------------------------------- Bug #21026: `def __FILE__.a; end` should be a syntax error https://bugs.ruby-lang.org/issues/21026#change-111446 * Author: Earlopain (Earlopain _) * Status: Open * ruby -v: ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- Constants like `__FILE__`, `__LINE__` and `__ENCODING__` are literals and as such you shouldn't be able to defined singleton methods on them. It already doesn't seem to actually do anything: ```rb def __FILE__.a end __FILE__.a #=> undefined method 'a' for an instance of String (NoMethodError) ``` Wrapping it in brackets correctly reports a syntax error: ```rb code.rb:1: syntax error found (SyntaxError)
1 | def (__FILE__).a | ^~~~~~~~ cannot define singleton method for literals 2 | end
The behavior is consistent between prism and parse.y
`__ENCODING__` is frozen and so will result in a runtime error. Same for `__LINE__`, and also `__FILE__` with frozen string literals.
--
https://bugs.ruby-lang.org/