diff options
| author | gingerBill <bill@gingerbill.org> | 2023-09-26 12:21:43 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-09-26 12:21:43 +0100 |
| commit | c08bf1204f49207454edb82f0328d42d64a6bc05 (patch) | |
| tree | 98c1d066b09fea7415c7743b9a482018665c1717 /src/check_expr.cpp | |
| parent | ecde06e3a31179bd8f86383fd65cfbce31ab6d9a (diff) | |
Add `cstring` specific comparison procedures to fix comparisons like `cstring("") != cstring(nil)`
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index abcb7fd72..5fab87a7d 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2462,8 +2462,9 @@ gb_internal void add_comparison_procedures_for_fields(CheckerContext *c, Type *t add_package_dependency(c, "runtime", "quaternion256_ne"); break; case Basic_cstring: - add_package_dependency(c, "runtime", "cstring_to_string"); - /*fallthrough*/ + add_package_dependency(c, "runtime", "cstring_eq"); + add_package_dependency(c, "runtime", "cstring_ne"); + break; case Basic_string: add_package_dependency(c, "runtime", "string_eq"); add_package_dependency(c, "runtime", "string_ne"); @@ -2621,7 +2622,16 @@ gb_internal void check_comparison(CheckerContext *c, Ast *node, Operand *x, Oper if (!is_type_untyped(x->type)) size = gb_max(size, type_size_of(x->type)); if (!is_type_untyped(y->type)) size = gb_max(size, type_size_of(y->type)); - if (is_type_string(x->type) || is_type_string(y->type)) { + if (is_type_cstring(x->type) && is_type_cstring(y->type)) { + switch (op) { + case Token_CmpEq: add_package_dependency(c, "runtime", "cstring_eq"); break; + case Token_NotEq: add_package_dependency(c, "runtime", "cstring_ne"); break; + case Token_Lt: add_package_dependency(c, "runtime", "cstring_lt"); break; + case Token_Gt: add_package_dependency(c, "runtime", "cstring_gt"); break; + case Token_LtEq: add_package_dependency(c, "runtime", "cstring_le"); break; + case Token_GtEq: add_package_dependency(c, "runtime", "cstring_gt"); break; + } + } else if (is_type_string(x->type) || is_type_string(y->type)) { switch (op) { case Token_CmpEq: add_package_dependency(c, "runtime", "string_eq"); break; case Token_NotEq: add_package_dependency(c, "runtime", "string_ne"); break; |