summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--parse.y10
-rw-r--r--test/ruby/test_array.rb3
3 files changed, 13 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index ba79d0f3d2..52e1e2b894 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Dec 23 20:48:52 2009 Nobuyoshi Nakada <[email protected]>
+
+ * parse.y (args): splat other than direct array literal.
+ [ruby-dev:39771]
+
Wed Dec 23 17:23:52 2009 Nobuyoshi Nakada <[email protected]>
* eval.c (rb_load): initialize orig_func. [ruby-core:27296]
diff --git a/parse.y b/parse.y
index 11be7c4c68..ed61a7ce80 100644
--- a/parse.y
+++ b/parse.y
@@ -1455,7 +1455,7 @@ args : arg_value
| tSTAR arg_value
{
/*%%%*/
- $$ = splat_array($2);
+ if (!($$ = splat_array($2))) $$ = NEW_SPLAT($2);
/*%
$$ = arg_add_star(arg_new(), $2);
%*/
@@ -1569,14 +1569,15 @@ primary : literal
{
$$ = NEW_COLON3($2);
}
- | tLBRACK aref_args ']'
+ | tLBRACK {$<num>$ = ruby_sourceline;} aref_args ']'
{
- if ($2 == 0) {
+ if ($3 == 0) {
$$ = NEW_ZARRAY(); /* zero length array*/
}
else {
- $$ = $2;
+ $$ = $3;
}
+ nd_set_line($$, $<num>2);
}
| tLBRACE assoc_list '}'
{
@@ -5312,6 +5313,7 @@ static NODE *
splat_array(node)
NODE* node;
{
+ if (nd_type(node) == NODE_NEWLINE) node = node->nd_next;
if (nd_type(node) == NODE_SPLAT) node = node->nd_head;
if (nd_type(node) == NODE_ARRAY) return node;
return 0;
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 02733b941a..adac3e19d7 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -1280,7 +1280,8 @@ class TestArray < Test::Unit::TestCase
def test_splat
a = [2,3]
assert_equal([1,2,3], [1, *a])
+ bug2401 = '[ruby-dev:39771]'
a = [2,3]
- assert_equal([2,3], [*a])
+ assert_equal([2,3], [*a], bug2401)
end
end