@@ -94,7 +94,7 @@ class Crystal::CodeGenVisitor
94
94
95
95
if is_closure
96
96
clear_current_debug_location if @debug .line_numbers?
97
- setup_closure_vars context.closure_vars.not_nil!
97
+ setup_closure_vars target_def.vars, context.closure_vars.not_nil!
98
98
else
99
99
context.reset_closure
100
100
end
@@ -364,19 +364,26 @@ class Crystal::CodeGenVisitor
364
364
end
365
365
end
366
366
367
- def setup_closure_vars (closure_vars, context = self .context, closure_ptr = fun_literal_closure_ptr)
367
+ def setup_closure_vars (def_vars, closure_vars, context = self .context, closure_ptr = fun_literal_closure_ptr)
368
368
if context.closure_skip_parent
369
369
parent_context = context.closure_parent_context.not_nil!
370
- setup_closure_vars(parent_context.closure_vars.not_nil!, parent_context, closure_ptr)
370
+ setup_closure_vars(def_vars, parent_context.closure_vars.not_nil!, parent_context, closure_ptr)
371
371
else
372
372
closure_vars.each_with_index do |var , i |
373
+ # A closured var in this context might have the same name as
374
+ # a local var in another context, for example if the local var
375
+ # was defined before the closured var. In this case, don't
376
+ # consider the local var as closured.
377
+ def_var = def_vars.try & .[var.name]?
378
+ next if def_var && ! def_var.closured?
379
+
373
380
self .context.vars[var.name] = LLVMVar .new(gep(closure_ptr, 0 , i, var.name), var.type)
374
381
end
375
382
376
383
if (closure_parent_context = context.closure_parent_context) &&
377
384
(parent_vars = closure_parent_context.closure_vars)
378
385
parent_closure_ptr = gep(closure_ptr, 0 , closure_vars.size, " parent_ptr" )
379
- setup_closure_vars(parent_vars, closure_parent_context, load(parent_closure_ptr, " parent" ))
386
+ setup_closure_vars(def_vars, parent_vars, closure_parent_context, load(parent_closure_ptr, " parent" ))
380
387
elsif closure_self = context.closure_self
381
388
offset = context.closure_parent_context ? 1 : 0
382
389
self_value = gep(closure_ptr, 0 , closure_vars.size + offset, " self" )
0 commit comments