Permalink
Browse files

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
  • Loading branch information...
nobu committed Mar 23, 2018
1 parent 631272f commit 140512d2225e6fd046ba1bdbcd1a27450f55c233
Showing with 17 additions and 8 deletions.
  1. +2 −0 NEWS
  2. +1 −1 parse.y
  3. +13 −5 spec/ruby/language/rescue_spec.rb
  4. +1 −2 test/ruby/test_parse.rb
View
2 NEWS
@@ -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
View
@@ -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) {
@@ -195,18 +195,26 @@ class ArbitraryException < StandardError
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
View
@@ -14,13 +14,12 @@ def teardown
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

0 comments on commit 140512d

Please sign in to comment.