diff --git a/spec/compiler/codegen/class_spec.cr b/spec/compiler/codegen/class_spec.cr index 84c17d49c55463c15b5387bee70fdcde7e5b702e..4b1edd9f74f1a330ba2ed12cfd76290e0dd56020 100644 --- a/spec/compiler/codegen/class_spec.cr +++ b/spec/compiler/codegen/class_spec.cr @@ -542,4 +542,22 @@ describe "Code gen: class" do ex.foo )) end + + it "resolves type declaration when accessing instance var (#348)" do + build(%( + require "prelude" + + lib C + type Foo = Int64[8] + end + + class Bar + def initialize + @foo :: C::Foo + end + end + + Bar.new.inspect + )) + end end diff --git a/src/compiler/crystal/codegen/codegen.cr b/src/compiler/crystal/codegen/codegen.cr index cf0fe5875aa028bbdfb9cccace5758e6b2c8c79c..18081b3e85939eb4066fa830d50cdfed9e55a0b7 100644 --- a/src/compiler/crystal/codegen/codegen.cr +++ b/src/compiler/crystal/codegen/codegen.cr @@ -330,7 +330,7 @@ module Crystal when Var context.vars[node_exp.name].pointer when InstanceVar - instance_var_ptr (context.type as InstanceVarContainer), node_exp.name, llvm_self_ptr + instance_var_ptr (context.type.remove_typedef as InstanceVarContainer), node_exp.name, llvm_self_ptr when Path accept(node_exp) global_name = node_exp.target_const.not_nil!.llvm_name diff --git a/src/compiler/crystal/semantic/type_inference.cr b/src/compiler/crystal/semantic/type_inference.cr index 0c41e825d676bbfc6b32b514a9050d8211f0f254..4e79999a6d99f5164aecad0759d16f3c955042fa 100644 --- a/src/compiler/crystal/semantic/type_inference.cr +++ b/src/compiler/crystal/semantic/type_inference.cr @@ -279,7 +279,7 @@ module Crystal end def lookup_instance_var(node) - case scope = @scope + case scope = @scope.try &.remove_typedef when Nil node.raise "can't use instance variables at the top level" when Program diff --git a/src/compiler/crystal/types.cr b/src/compiler/crystal/types.cr index 83f642091c7aa651f5373282b7b9ae92493bc18a..f2bfcaa1ddc96c80648d95b6a10b53758abd01ec 100644 --- a/src/compiler/crystal/types.cr +++ b/src/compiler/crystal/types.cr @@ -1797,6 +1797,8 @@ module Crystal delegate pointer?, typedef delegate defs, typedef delegate macros, typedef + delegate passed_by_value?, typedef + delegate reference_like?, typedef def parents typedef_parents = typedef.parents