From e60951a902976acfef74b863463bb116858366c5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 4 Aug 2024 10:51:08 +0100 Subject: Begin converting `os.Errno` to be a `nil`-able type as a transition period --- src/check_expr.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/check_expr.cpp') diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 01ff9da5b..78b88f21a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -127,6 +127,8 @@ gb_internal bool complete_soa_type(Checker *checker, Type *t, bool wait_to_finis gb_internal bool check_is_castable_to(CheckerContext *c, Operand *operand, Type *y); +gb_internal bool is_exact_value_zero(ExactValue const &v); + enum LoadDirectiveResult { LoadDirective_Success = 0, LoadDirective_Error = 1, @@ -4364,6 +4366,25 @@ gb_internal void convert_to_typed(CheckerContext *c, Operand *operand, Type *tar } switch (t->kind) { + // IMPORTANT NOTE HACK(bill): This is just to allow for comparisons against `0` with the `os.Error` type + // as a kind of transition period + case Type_Enum: + if (operand->mode == Addressing_Constant && + target_type->kind == Type_Named && + target_type->Named.name == "Error") { + Entity *e = target_type->Named.type_name; + if (e->pkg && e->pkg->name == "os") { + if (is_exact_value_zero(operand->value)) { + check_is_expressible(c, operand, t); + if (operand->mode == Addressing_Invalid) { + return; + } + update_untyped_expr_value(c, operand->expr, operand->value); + } + } + } + break; + case Type_Basic: if (operand->mode == Addressing_Constant) { check_is_expressible(c, operand, t); -- cgit v1.2.3