From: merch-redmine@... Date: 2021-06-07T15:41:45+00:00 Subject: [ruby-core:104191] [Ruby master Bug#15928] Constant declaration does not conform to JIS 3017:2013 Issue #15928 has been updated by jeremyevans0 (Jeremy Evans). This was discussed at the May 2021 developer meeting. @naruse is against breaking backwards compatibility for this in 3.1, so I'll repropose this after the release of 3.1. ---------------------------------------- Bug #15928: Constant declaration does not conform to JIS 3017:2013 https://bugs.ruby-lang.org/issues/15928#change-92371 * 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: