From 5c58ac02382d1560ac20a2e54db041601f7631a2 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 5 Oct 2019 10:26:47 -0300 Subject: [PATCH] analysis: add contextual checks for Assign expr --- src/analysis.zig | 18 ++++++++++++++---- src/codegen.zig | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/analysis.zig b/src/analysis.zig index 68792fe..a960cbf 100644 --- a/src/analysis.zig +++ b/src/analysis.zig @@ -329,8 +329,8 @@ pub const TypeSolver = struct { }, else => { - std.debug.warn( - "Expected Struct/Enum as get target, got {}\n", + self.doError( + "Expected Struct/Enum as get target, got {}", comp.SymbolUnderlyingTypeEnum(global_typ), ); @@ -340,12 +340,22 @@ pub const TypeSolver = struct { }, .Assign => |assign| { + if (ctx.current_scope == null) { + self.doError("Can't assign without a scope"); + return CompileError.Invalid; + } + var var_type = ctx.current_scope.?.env.get( assign.name.lexeme, - ).?.value; + ); + + if (var_type == null) { + self.doError("Assign target variable not found"); + return CompileError.Invalid; + } var value_type = try self.resolveExprType(ctx, assign.value); - try self.expectSymUnTypeEqual(var_type, value_type); + try self.expectSymUnTypeEqual(var_type.?.value, value_type); return var_type; }, diff --git a/src/codegen.zig b/src/codegen.zig index 3d0023b..e28085b 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -13,6 +13,7 @@ pub const CompileError = error{ LLVMError, EmitError, TypeError, + Invalid, }; fn mkLLVMBool(val: bool) llvm.LLVMValueRef {