Project

General

Profile

Actions

Bug #15928

closed

Constant declaration does not conform to JIS 3017:2013

Added by yugui (Yuki Sonoda) over 5 years ago. Updated almost 3 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.7.0dev (2019-06-16T14:01:46Z master d4929f5185) [x86_64-darwin18]
[ruby-core:93184]
Tags:

Description

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.

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
  1. rhs
  2. 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.


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #4443: odd evaluation order in a multiple assignmentClosedko1 (Koichi Sasada)Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like1