diff --git a/spec/compiler/codegen/closure_spec.cr b/spec/compiler/codegen/closure_spec.cr index db804a8a0c74..4dfe9f3825e6 100644 --- a/spec/compiler/codegen/closure_spec.cr +++ b/spec/compiler/codegen/closure_spec.cr @@ -623,4 +623,20 @@ describe "Code gen: closure" do Foo.foo )).to_b.should be_false end + + it "captures block and accesses local variable (#2050)" do + run(%( + require "prelude" + + def capture(&block) + block + end + + coco = 1 + capture do + coco + end + coco + )).to_i.should eq(1) + end end diff --git a/src/compiler/crystal/codegen/codegen.cr b/src/compiler/crystal/codegen/codegen.cr index 26a9c97a83b9..3bc5788062ed 100644 --- a/src/compiler/crystal/codegen/codegen.cr +++ b/src/compiler/crystal/codegen/codegen.cr @@ -179,6 +179,10 @@ module Crystal def initialize(@codegen) end + def visit(node : FileNode) + true + end + def visit(node : Expressions) true end @@ -264,16 +268,13 @@ module Crystal end def visit(node : FileNode) - old_vars = context.vars - context.vars = LLVMVars.new - - file_module = @mod.file_module(node.filename) - if vars = file_module.vars? - alloca_vars vars, file_module + with_context(Context.new(context.fun, context.type)) do + file_module = @mod.file_module(node.filename) + if vars = file_module.vars? + alloca_vars vars, file_module + end + node.node.accept self end - node.node.accept self - - context.vars = old_vars false end