diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-23 00:40:08 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-23 00:40:08 +0000 |
commit | 140512d2225e6fd046ba1bdbcd1a27450f55c233 (patch) | |
tree | ea3c902891394c57d14dc04c3bdcf3ced924423b | |
parent | 631272ff1587a7a76f75593ec5964493222ca50c (diff) |
parse.y: else without rescue
* parse.y (bodystmt): [EXPERIMENTAL] make `else` without `rescue`
a syntax error. [DevelopersMeeting20180315Japan]
https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20180315Japan
https://docs.google.com/document/d/1RT0ijSo8uJ4Awn3CEvuYkjH0TVeXSYgeAFNmVGYC3ak/edit#
> * do-else-end
> https://twitter.com/joker1007/status/974173396006129664
> https://twitter.com/joker1007/status/974173641347756032
> https://twitter.com/joker1007/status/974176512554369027
> Will be SyntaxError in 2.6-preview2
> All of begin/do/def (experimental)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62901 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | parse.y | 2 | ||||
-rw-r--r-- | spec/ruby/language/rescue_spec.rb | 18 | ||||
-rw-r--r-- | test/ruby/test_parse.rb | 3 |
4 files changed, 17 insertions, 8 deletions
@@ -18,6 +18,8 @@ with all sufficient information, see the ChangeLog file or Redmine * refinements take place at block passing. [Feature #14223] +* `else` without `rescue` is now causes a syntax error. [EXPERIMENTAL] + === Core classes updates (outstanding ones only) * Array @@ -1000,7 +1000,7 @@ bodystmt : compstmt $$ = NEW_RESCUE($1, $2, $3, &@$); } else if ($3) { - rb_warn0("else without rescue is useless"); + compile_error(p, "else without rescue is useless"); $$ = block_append(p, $$, $3); } if ($4) { diff --git a/spec/ruby/language/rescue_spec.rb b/spec/ruby/language/rescue_spec.rb index b3de84468b..66a493cd34 100644 --- a/spec/ruby/language/rescue_spec.rb +++ b/spec/ruby/language/rescue_spec.rb @@ -195,18 +195,26 @@ describe "The rescue keyword" do ScratchPad.recorded.should == [:one, :else_ran, :ensure_ran, :outside_begin] end - it "will execute an else block even without rescue and ensure" do - lambda { - eval <<-ruby + else_without_rescue = lambda { + eval <<-ruby begin ScratchPad << :begin else ScratchPad << :else end ruby - }.should complain(/else without rescue is useless/) + } + + ruby_version_is ""..."2.6" do + it "will execute an else block even without rescue and ensure" do + else_without_rescue.should complain(/else without rescue is useless/) + + ScratchPad.recorded.should == [:begin, :else] + end + end - ScratchPad.recorded.should == [:begin, :else] + ruby_version_is "2.6" do + else_without_rescue.should raise_error(SyntaxError) end it "will not execute an else block if an exception was raised" do diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index cd1c5a3ecc..e2dd179f9a 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -14,13 +14,12 @@ class TestParse < Test::Unit::TestCase end def test_else_without_rescue - x = eval <<-END, nil, __FILE__, __LINE__+1 + assert_syntax_error(<<-END, /else without rescue/) begin else 42 end END - assert_equal(42, x) end def test_alias_backref |