@@ -202,6 +202,49 @@ def test_argument_forwarding_with_anon_rest_kwrest_and_block
202202 assert_syntax_error ( "def f(...); g(&); end" , /no anonymous block parameter/ )
203203 end
204204
205+ def test_no_block_argument_in_method
206+ assert_valid_syntax ( "def f(&nil) end" )
207+ assert_valid_syntax ( "def f(a, &nil) end" )
208+ assert_valid_syntax ( "def f(*rest, &nil) end" )
209+ assert_valid_syntax ( "def f(*rest, p, &nil) end" )
210+ assert_valid_syntax ( "def f(a, *rest, &nil) end" )
211+ assert_valid_syntax ( "def f(a, *rest, p, &nil) end" )
212+ assert_valid_syntax ( "def f(a, k: nil, &nil) end" )
213+ assert_valid_syntax ( "def f(a, k: nil, **kw, &nil) end" )
214+ assert_valid_syntax ( "def f(a, *rest, k: nil, &nil) end" )
215+ assert_valid_syntax ( "def f(a, *rest, k: nil, **kw, &nil) end" )
216+ assert_valid_syntax ( "def f(a, *rest, p, k: nil, &nil) end" )
217+ assert_valid_syntax ( "def f(a, *rest, p, k: nil, **kw, &nil) end" )
218+
219+ obj = Object . new
220+ obj . instance_eval "def f(&nil) end"
221+ assert_raise_with_message ( ArgumentError , /block accepted/ ) { obj . f { } }
222+ assert_raise_with_message ( ArgumentError , /block accepted/ ) { obj . f ( &proc { } ) }
223+ end
224+
225+ def test_no_block_argument_in_block
226+ assert_valid_syntax ( "proc do |&nil| end" )
227+ assert_valid_syntax ( "proc do |a, &nil| end" )
228+ assert_valid_syntax ( "proc do |*rest, &nil| end" )
229+ assert_valid_syntax ( "proc do |*rest, p, &nil| end" )
230+ assert_valid_syntax ( "proc do |a, *rest, &nil| end" )
231+ assert_valid_syntax ( "proc do |a, *rest, p, &nil| end" )
232+ assert_valid_syntax ( "proc do |a, k: nil, &nil| end" )
233+ assert_valid_syntax ( "proc do |a, k: nil, **kw, &nil| end" )
234+ assert_valid_syntax ( "proc do |a, *rest, k: nil, &nil| end" )
235+ assert_valid_syntax ( "proc do |a, *rest, k: nil, **kw, &nil| end" )
236+ assert_valid_syntax ( "proc do |a, *rest, p, k: nil, &nil| end" )
237+ assert_valid_syntax ( "proc do |a, *rest, p, k: nil, **kw, &nil| end" )
238+
239+ pr = eval "proc {|&nil|}"
240+ assert_nil ( pr . call )
241+ assert_raise_with_message ( ArgumentError , /block accepted/ ) { pr . call { } }
242+ pr = eval "proc {|a, &nil| a}"
243+ assert_nil ( pr . call )
244+ assert_equal ( 1 , pr . call ( 1 ) )
245+ assert_raise_with_message ( ArgumentError , /block accepted/ ) { pr . call { } }
246+ end
247+
205248 def test_newline_in_block_parameters
206249 bug = '[ruby-dev:45292]'
207250 [ "" , "a" , "a, b" ] . product ( [ "" , ";x" , [ ";" , "x" ] ] ) do |params |
0 commit comments