analysis: add contextual checks for Assign expr
This commit is contained in:
parent
809dad1095
commit
5c58ac0238
2 changed files with 15 additions and 4 deletions
|
@ -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;
|
||||
},
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@ pub const CompileError = error{
|
|||
LLVMError,
|
||||
EmitError,
|
||||
TypeError,
|
||||
Invalid,
|
||||
};
|
||||
|
||||
fn mkLLVMBool(val: bool) llvm.LLVMValueRef {
|
||||
|
|
Loading…
Reference in a new issue