Project

General

Profile

Actions

Bug #22264

closed

Warning missing from parse.y hash literals

Bug #22264: Warning missing from parse.y hash literals

Added by kddnewton (Kevin Newton) 2 days ago. Updated 1 day ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:126499]

Description

$ ruby --parser=parse.y -cve '{**{}, a: 1, **{a: 2}}'
ruby 4.1.0dev (2026-04-21T02:07:14Z aot be86d5704f) [arm64-darwin23]
Syntax OK
$ ruby --parser=parse.y -cve '{a: 1, **{a: 2}}'
ruby 4.1.0dev (2026-04-21T02:07:14Z aot be86d5704f) [arm64-darwin23]
-e:1: warning: key :a is duplicated and overwritten on line 1
Syntax OK

Updated by jeremyevans0 (Jeremy Evans) 1 day ago Actions #1 [ruby-core:126501]

I'm not sure whether it is desirable to warn for {a: 1, **{a: 2}}. I would guess that internally, this hits the same warning for {a: 1, a: 2} (which should warn), but for implementation details, it doesn't hit the warning for {**{}, a: 1, **{a: 2}}.

I think we should only warn for keywords in the same hash, not keywords in a splatted hash, even if the splatted hash is a literal. For one, warnings are to help Ruby programmers, and {a: 1, **{a: 2}} is not something a typical Ruby programmer would write (while {a: 1, a: 2} is a fairly common mistake). There is no reason for a Ruby programmer to deliberately keyword splat a literal hash inside a another hash.

Updated by nobu (Nobuyoshi Nakada) 1 day ago · Edited Actions #2 [ruby-core:126505]

  • Backport changed from 3.3: UNKNOWN, 3.4: UNKNOWN, 4.0: UNKNOWN to 3.3: REQUIRED, 3.4: REQUIRED, 4.0: REQUIRED

I agree with Jeremy's concern, but I think it should be discussed separately.

As for this bug, it stems from an oversight when we allowed ** to be placed in locations other than the end of a hash literal; it should be fixed simply by removing the condition “unless the first element is NULL” from assocs : assocs ‘,’ assoc.
GH-18506

Updated by nobu (Nobuyoshi Nakada) 1 day ago Actions #3

  • Status changed from Open to Closed

Applied in changeset git|e5132b162737829f744b2b23908b9d08479db977.


[Bug #22264] Warn for duplicate keys after leading keyword splat

Leading keyword splats must not suppress duplicate literal key
warnings.

Actions

Also available in: PDF Atom