Skip to content

Commit a6ddeb3

Browse files
authoredOct 17, 2017
Merge pull request #5138 from crystal-lang/bug/block-arg-underscore
Codegen: don't assign yield exp to underscore block arguments
2 parents 181986d + a4ddfea commit a6ddeb3

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed
 

‎spec/compiler/codegen/block_spec.cr

+9
Original file line numberDiff line numberDiff line change
@@ -1509,4 +1509,13 @@ describe "Code gen: block" do
15091509
a + b
15101510
)).to_i.should eq(3)
15111511
end
1512+
1513+
it "codegens block with repeated underscore and different types (#4711)" do
1514+
codegen(%(
1515+
def foo
1516+
yield('0', 0)
1517+
end
1518+
foo{|_, _| }
1519+
))
1520+
end
15121521
end

‎src/compiler/crystal/codegen/codegen.cr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1407,7 +1407,7 @@ module Crystal
14071407
exp_value = exp_values.first[0]
14081408
exp_type.tuple_types.each_with_index do |tuple_type, i|
14091409
arg = block.args[i]?
1410-
if arg
1410+
if arg && arg.name != "_"
14111411
t_type = tuple_type
14121412
t_value = codegen_tuple_indexer(exp_type, exp_value, i)
14131413
block_var = block_context.vars[arg.name]
@@ -1416,7 +1416,7 @@ module Crystal
14161416
end
14171417
else
14181418
exp_values.each_with_index do |(exp_value, exp_type), i|
1419-
if arg = block.args[i]?
1419+
if (arg = block.args[i]?) && arg.name != "_"
14201420
block_var = block_context.vars[arg.name]
14211421
assign block_var.pointer, block_var.type, exp_type, exp_value
14221422
end

0 commit comments

Comments
 (0)
Please sign in to comment.