diff --git a/spec/compiler/semantic/instance_var_spec.cr b/spec/compiler/semantic/instance_var_spec.cr index de53d8a652a8..6c1c9a006c41 100644 --- a/spec/compiler/semantic/instance_var_spec.cr +++ b/spec/compiler/semantic/instance_var_spec.cr @@ -4971,6 +4971,25 @@ describe "Semantic: instance var" do CRYSTAL end + it "resolves unqualified constants in block inside instance var initializer (#14827)" do + assert_type(<<-CRYSTAL) { bool } + def with_block + yield + end + + module A + struct B + end + + struct C + @data : B = with_block { B.new } + end + end + + A::C.new.is_a?(A::C) + CRYSTAL + end + it "errors when assigning instance variable at top level block" do assert_error <<-CRYSTAL, "can't use instance variables at the top level" def foo diff --git a/src/compiler/crystal/semantic/instance_vars_initializer_visitor.cr b/src/compiler/crystal/semantic/instance_vars_initializer_visitor.cr index a269e49bc113..0e33499bcbfb 100644 --- a/src/compiler/crystal/semantic/instance_vars_initializer_visitor.cr +++ b/src/compiler/crystal/semantic/instance_vars_initializer_visitor.cr @@ -105,7 +105,9 @@ class Crystal::InstanceVarsInitializerVisitor < Crystal::SemanticVisitor ivar_visitor = MainVisitor.new(program, meta_vars: i.meta_vars) ivar_visitor.scope = scope.metaclass - value.accept ivar_visitor + ivar_visitor.pushing_type(scope.as(ModuleType)) do + value.accept ivar_visitor + end end end end