summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--parse.y16
-rw-r--r--test/ruby/test_syntax.rb24
3 files changed, 40 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 06b002cb30..1f0cc16dea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Mar 5 15:56:18 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (f_arg_asgn): define optional arguments as argument
+ variables in the rhs default expressions.
+ [ruby-core:61299] [Bug #9593]
+
Wed Mar 5 11:58:30 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/openssl/ossl.c (ossl_make_error): check NULL for unknown
diff --git a/parse.y b/parse.y
index 9b7869b359..f7f41c6111 100644
--- a/parse.y
+++ b/parse.y
@@ -784,7 +784,7 @@ static void token_info_pop(struct parser_params*, const char *token);
%type <node> mlhs mlhs_head mlhs_basic mlhs_item mlhs_node mlhs_post mlhs_inner
%type <id> fsym keyword_variable user_variable sym symbol operation operation2 operation3
%type <id> cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg f_bad_arg
-%type <id> f_kwrest f_label
+%type <id> f_kwrest f_label f_arg_asgn
/*%%%*/
/*%
%type <val> program reswords then do dot_or_colon
@@ -4548,9 +4548,15 @@ f_norm_arg : f_bad_arg
}
;
-f_arg_item : f_norm_arg
+f_arg_asgn : f_norm_arg
{
arg_var(get_id($1));
+ $$ = $1;
+ }
+ ;
+
+f_arg_item : f_arg_asgn
+ {
/*%%%*/
$$ = NEW_ARGS_AUX($1, 1);
/*%
@@ -4708,9 +4714,8 @@ f_kwrest : kwrest_mark tIDENTIFIER
}
;
-f_opt : f_norm_arg '=' arg_value
+f_opt : f_arg_asgn '=' arg_value
{
- arg_var(get_id($1));
$$ = assignable($1, $3);
/*%%%*/
$$ = NEW_OPT_ARG(0, $$);
@@ -4720,9 +4725,8 @@ f_opt : f_norm_arg '=' arg_value
}
;
-f_block_opt : f_norm_arg '=' primary_value
+f_block_opt : f_arg_asgn '=' primary_value
{
- arg_var(get_id($1));
$$ = assignable($1, $3);
/*%%%*/
$$ = NEW_OPT_ARG(0, $$);
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index cac755a390..bc1d80f990 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -111,6 +111,30 @@ class TestSyntax < Test::Unit::TestCase
assert_raise(TypeError) {o.kw(**h)}
end
+ def test_keyword_self_reference
+ bug9593 = '[ruby-core:61299] [Bug #9593]'
+ o = Object.new
+ def o.foo(var: defined?(var)) var end
+ assert_equal(42, o.foo(var: 42))
+ assert_equal("local-variable", o.foo, bug9593)
+
+ o = Object.new
+ def o.foo(var: var) var end
+ assert_nil(o.foo, bug9593)
+ end
+
+ def test_optional_self_reference
+ bug9593 = '[ruby-core:61299] [Bug #9593]'
+ o = Object.new
+ def o.foo(var = defined?(var)) var end
+ assert_equal(42, o.foo(42))
+ assert_equal("local-variable", o.foo, bug9593)
+
+ o = Object.new
+ def o.foo(var = var) var end
+ assert_nil(o.foo, bug9593)
+ end
+
def test_warn_grouped_expression
bug5214 = '[ruby-core:39050]'
assert_warning("", bug5214) do