summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parse.y12
1 files changed, 11 insertions, 1 deletions
diff --git a/parse.y b/parse.y
index c575dfdded..ba43053a86 100644
--- a/parse.y
+++ b/parse.y
@@ -5151,6 +5151,12 @@ assocs : assoc
assocs = tail;
}
else if (tail) {
+ 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;
+ }
assocs = list_concat(assocs, tail);
}
$$ = assocs;
@@ -5188,7 +5194,11 @@ assoc : arg_value tASSOC arg_value
| tDSTAR arg_value
{
/*%%%*/
- $$ = list_append(p, NEW_LIST(0, &@$), $2);
+ if (nd_type($2) == NODE_HASH &&
+ !($2->nd_head && $2->nd_head->nd_alen))
+ $$ = 0;
+ else
+ $$ = list_append(p, NEW_LIST(0, &@$), $2);
/*% %*/
/*% ripper: assoc_splat!($2) %*/
}