Issue #9376 has been updated by Yui NARUSE.

Backport changed from 1.9.3: DONTNEED, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: DONTNEED, 2.0.0: DONTNEED, 2.1: DONTNEED

----------------------------------------
Bug #9376: Passing do/end block inside decorated method fails, while passing {} block works.
https://bugs.ruby-lang.org/issues/9376#change-45259

* Author: Joe McIlvain
* Status: Closed
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: 2.1.0-p0
* Backport: 1.9.3: DONTNEED, 2.0.0: DONTNEED, 2.1: DONTNEED
----------------------------------------
=begin
Since method (({def})) returns the symbol in 2.1, it opens the door for a decorator pattern in which the method def is the argument to a method.
This currently works, unless the method happens to call another method and pass it a (({do/end})) block.
However, using (({{}})) instead causes no syntax error.
Here is the code to reproduce:

 def foo(meth); end
 x = Object.new

 foo def bar(arg)
   x.tap { }     #=> (no problem here)
   x.tap do end  #=> syntax error, unexpected keyword_do_block, expecting keyword_end (SyntaxError)
 end
=end




-- 
http://bugs.ruby-lang.org/