diff --git a/parse.y b/parse.y index 5b9955a66a..e87c98d4ff 100644 --- a/parse.y +++ b/parse.y @@ -5879,7 +5879,10 @@ p_var_ref : '^' tIDENTIFIER { /*%%%*/ NODE *n = gettable(p, $2, &@$); - if (!(nd_type_p(n, NODE_LVAR) || nd_type_p(n, NODE_DVAR))) { + if (!n) { + n = NEW_ERROR(&@$); + } + else if (!(nd_type_p(n, NODE_LVAR) || nd_type_p(n, NODE_DVAR))) { compile_error(p, "%"PRIsVALUE": no such local variable", rb_id2str($2)); } $$ = n; diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 954ad56156..854fd46027 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -381,6 +381,7 @@ class TestSyntax < Test::Unit::TestCase assert_syntax_error("def foo(var: var) var end", message) assert_syntax_error("def foo(var: bar(var)) var end", message) assert_syntax_error("def foo(var: bar {var}) var end", message) + assert_syntax_error("def foo(var: (1 in ^var)); end", message) o = Object.new assert_warn("") do @@ -446,6 +447,7 @@ class TestSyntax < Test::Unit::TestCase assert_syntax_error("def foo(var = bar {var}) var end", message) assert_syntax_error("def foo(var = (def bar;end; var)) var end", message) assert_syntax_error("def foo(var = (def self.bar;end; var)) var end", message) + assert_syntax_error("def foo(var = (1 in ^var)); end", message) o = Object.new assert_warn("") do