summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-23 00:40:08 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-23 00:40:08 +0000
commit140512d2225e6fd046ba1bdbcd1a27450f55c233 (patch)
treeea3c902891394c57d14dc04c3bdcf3ced924423b
parent631272ff1587a7a76f75593ec5964493222ca50c (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--NEWS2
-rw-r--r--parse.y2
-rw-r--r--spec/ruby/language/rescue_spec.rb18
-rw-r--r--test/ruby/test_parse.rb3
4 files changed, 17 insertions, 8 deletions
diff --git a/NEWS b/NEWS
index 3769b80cde..a8e1874939 100644
--- a/NEWS
+++ b/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
diff --git a/parse.y b/parse.y
index f838d3cb05..5f7bd2abe2 100644
--- a/parse.y
+++ b/parse.y
@@ -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