aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-10-11 04:46:42 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-10-11 04:46:42 +0000
commit1571682719525d67ae355e4a0394c002f4aa30f1 (patch)
tree7a430f1db89189d02a0e92664b473906b0d9bc95
parent81ce0e38535d71e53635354bfab6f64a30d556f0 (diff)
downloadruby-1571682719525d67ae355e4a0394c002f4aa30f1.tar.gz
parse.y: precedence of duplicated keys
* parse.y (assocs): concatenate splatted literal hashes. the former key has precedence even if duplicated literal keys follow. [ruby-core:65368] [Bug #10315] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47877 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--parse.y10
-rw-r--r--test/ruby/test_syntax.rb4
3 files changed, 19 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index bbb6357a70..afe887032b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Oct 11 13:46:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (assocs): concatenate splatted literal hashes. the
+ former key has precedence even if duplicated literal keys
+ follow. [ruby-core:65368] [Bug #10315]
+
Sat Oct 11 12:27:03 2014 Yuki Yugui Sonoda <yugui@yugui.jp>
* configure.in (RUBY_NACL): automatically locate pnacl-clang.
diff --git a/parse.y b/parse.y
index c0c9036641..768c0ca34e 100644
--- a/parse.y
+++ b/parse.y
@@ -4931,7 +4931,15 @@ assocs : assoc
| assocs ',' assoc
{
/*%%%*/
- $$ = list_concat($1, $3);
+ NODE *assocs = $1;
+ NODE *tail = $3;
+ if (assocs->nd_head &&
+ !tail->nd_head && nd_type(tail->nd_next) == NODE_ARRAY &&
+ nd_type(tail->nd_next->nd_head) == NODE_HASH) {
+ /* DSTAR */
+ tail = tail->nd_next->nd_head->nd_head;
+ }
+ $$ = list_concat(assocs, tail);
/*%
$$ = rb_ary_push($1, $3);
%*/
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 564a7eab29..013d9dcac3 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -112,6 +112,10 @@ class TestSyntax < Test::Unit::TestCase
assert_equal([11, 22], o.kw(k2: 22, **h))
assert_equal([11, 12], o.kw(**h, **{k2: 22}))
assert_equal([11, 22], o.kw(**{k2: 22}, **h))
+
+ bug10315 = '[ruby-core:65368] [Bug #10315]'
+ assert_equal([22, 2], o.kw(**{k1: 22}, **{k1: 23}), bug10315)
+
h = {k3: 31}
assert_raise(ArgumentError) {o.kw(**h)}
h = {"k1"=>11, k2: 12}