diff --git a/lib/parser/ruby27.y b/lib/parser/ruby27.y index eeabf2cbb..f6009f34e 100644 --- a/lib/parser/ruby27.y +++ b/lib/parser/ruby27.y @@ -2152,11 +2152,12 @@ opt_block_args_tail: p_var_ref: tCARET tIDENTIFIER { name = val[1][0] + lvar = @builder.accessible(@builder.ident(val[1])) + unless static_env.declared?(name) diagnostic :error, :undefined_lvar, { :name => name }, val[1] end - lvar = @builder.accessible(@builder.ident(val[1])) result = @builder.pin(val[0], lvar) } diff --git a/lib/parser/ruby30.y b/lib/parser/ruby30.y index 8599b0135..07e35e3cc 100644 --- a/lib/parser/ruby30.y +++ b/lib/parser/ruby30.y @@ -2225,11 +2225,12 @@ opt_block_args_tail: p_var_ref: tCARET tIDENTIFIER { name = val[1][0] + lvar = @builder.accessible(@builder.ident(val[1])) + unless static_env.declared?(name) diagnostic :error, :undefined_lvar, { :name => name }, val[1] end - lvar = @builder.accessible(@builder.ident(val[1])) result = @builder.pin(val[0], lvar) } diff --git a/lib/parser/ruby31.y b/lib/parser/ruby31.y index ee3994451..9a28ece5a 100644 --- a/lib/parser/ruby31.y +++ b/lib/parser/ruby31.y @@ -2323,11 +2323,12 @@ opt_block_args_tail: p_var_ref: tCARET tIDENTIFIER { name = val[1][0] + lvar = @builder.accessible(@builder.ident(val[1])) + unless static_env.declared?(name) diagnostic :error, :undefined_lvar, { :name => name }, val[1] end - lvar = @builder.accessible(@builder.ident(val[1])) result = @builder.pin(val[0], lvar) } diff --git a/lib/parser/ruby32.y b/lib/parser/ruby32.y index aba09fef6..867b3f0f2 100644 --- a/lib/parser/ruby32.y +++ b/lib/parser/ruby32.y @@ -2332,11 +2332,12 @@ opt_block_args_tail: p_var_ref: tCARET tIDENTIFIER { name = val[1][0] + lvar = @builder.accessible(@builder.ident(val[1])) + unless static_env.declared?(name) diagnostic :error, :undefined_lvar, { :name => name }, val[1] end - lvar = @builder.accessible(@builder.ident(val[1])) result = @builder.pin(val[0], lvar) } diff --git a/lib/parser/ruby33.y b/lib/parser/ruby33.y index a6e0c8bf5..79b76a2f6 100644 --- a/lib/parser/ruby33.y +++ b/lib/parser/ruby33.y @@ -2278,11 +2278,12 @@ opt_block_args_tail: p_var_ref: tCARET tIDENTIFIER { name = val[1][0] + lvar = @builder.accessible(@builder.ident(val[1])) + unless static_env.declared?(name) diagnostic :error, :undefined_lvar, { :name => name }, val[1] end - lvar = @builder.accessible(@builder.ident(val[1])) result = @builder.pin(val[0], lvar) } diff --git a/lib/parser/ruby34.y b/lib/parser/ruby34.y index 89602826b..57782787c 100644 --- a/lib/parser/ruby34.y +++ b/lib/parser/ruby34.y @@ -2285,11 +2285,12 @@ opt_block_args_tail: p_var_ref: tCARET tIDENTIFIER { name = val[1][0] + lvar = @builder.accessible(@builder.ident(val[1])) + unless static_env.declared?(name) diagnostic :error, :undefined_lvar, { :name => name }, val[1] end - lvar = @builder.accessible(@builder.ident(val[1])) result = @builder.pin(val[0], lvar) } diff --git a/test/test_parser.rb b/test/test_parser.rb index d67c09873..ce97a4426 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -9567,6 +9567,56 @@ def test_pattern_matching_blank_else ) end + def test_pattern_matching_numbered_parameter + assert_parses( + s(:numblock, + s(:send, + s(:int, 1), :then), 1, + s(:match_pattern, + s(:int, 1), + s(:pin, + s(:lvar, :_1)))), + %q{1.then { 1 in ^_1 }}, + %q{}, + %w(2.7) + ) + + assert_parses( + s(:numblock, + s(:send, + s(:int, 1), :then), 1, + s(:match_pattern_p, + s(:int, 1), + s(:pin, + s(:lvar, :_1)))), + %q{1.then { 1 in ^_1 }}, + %q{}, + SINCE_3_0 + ) + + assert_parses( + s(:case_match, + s(:int, 0), + s(:in_pattern, + s(:match_var, :_1), nil, nil), nil), + %q{case 0; in _1; end}, + %q{}, + %w(2.7) + ) + + assert_diagnoses( + [:error, :reserved_for_numparam, { :name => '_1' }], + %q{case 0; in _1; end}, + %q{ ^^ location}, + SINCE_3_0) + + assert_diagnoses( + [:error, :undefined_lvar, { :name => '_1' }], + %q{case 0; in ^_1; end}, + %q{ ^^ location}, + SINCE_2_7) + end + def assert_pattern_matching_defines_local_variables(match_code, lvar_names, versions = SINCE_2_7) code = "case 1; #{match_code}; then [#{lvar_names.join(', ')}]; end"