From: "mame (Yusuke Endoh)" Date: 2022-01-14T02:59:49+00:00 Subject: [ruby-core:107112] [Ruby master Bug#15928] Constant declaration does not conform to JIS 3017:2013 Issue #15928 has been updated by mame (Yusuke Endoh). This was discussed at the dev-meeting, and @matz said it's time for a change. @jeremyevans0 Could you merge your pull request? ---------------------------------------- Bug #15928: Constant declaration does not conform to JIS 3017:2013 https://bugs.ruby-lang.org/issues/15928#change-95958 * Author: yugui (Yuki Sonoda) * Status: Open * Priority: Normal * ruby -v: ruby 2.7.0dev (2019-06-16T14:01:46Z master d4929f5185) [x86_64-darwin18] * Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- The order of evaluation in constant declaration does not conform to JIS 3017:2013 11.4.2.2.3. # Problem Suppose that we are evaluating the following program. ```ruby expr::C = rhs ``` The standard seems to be requiring the following evaluation order: 1. expr * raise a `TypeError` if the value is not a kind of `Module` 2. rhs 3. `rb_const_set(expr, :C, rhs)` However, the actual implementation evaluates in the following order 1. rhs 2. expr 3. `rb_const_set(expr, :C, lhs)` * raise a `TypeError` if the expr is not a kind of `Module` # How to reproduce The next program does not raise "recv" but raises "value" ``` raise("recv")::C = raise("value") ``` The next program does not raise a `TypeError` but raises a `RuntimeError` ``` A = 1 A::C = raise("value") ``` # Question * Is this interpretation of the standard correct? * If it is, Should we change the current behavior? * If we shouldn't, does it mean an issue in the standard? c.f. * https://twitter.com/n0kada/status/1140234416175763456 -- https://bugs.ruby-lang.org/ Unsubscribe: