From c08bf1204f49207454edb82f0328d42d64a6bc05 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 Sep 2023 12:21:43 +0100 Subject: Add `cstring` specific comparison procedures to fix comparisons like `cstring("") != cstring(nil)` --- src/llvm_backend_expr.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src/llvm_backend_expr.cpp') diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 33768cc12..e0e36619b 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2414,7 +2414,28 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left } if (is_type_string(a)) { - if (is_type_cstring(a)) { + if (is_type_cstring(a) && is_type_cstring(b)) { + left = lb_emit_conv(p, left, t_cstring); + right = lb_emit_conv(p, right, t_cstring); + char const *runtime_procedure = nullptr; + switch (op_kind) { + case Token_CmpEq: runtime_procedure = "cstring_eq"; break; + case Token_NotEq: runtime_procedure = "cstring_ne"; break; + case Token_Lt: runtime_procedure = "cstring_lt"; break; + case Token_Gt: runtime_procedure = "cstring_gt"; break; + case Token_LtEq: runtime_procedure = "cstring_le"; break; + case Token_GtEq: runtime_procedure = "cstring_gt"; break; + } + GB_ASSERT(runtime_procedure != nullptr); + + auto args = array_make(permanent_allocator(), 2); + args[0] = left; + args[1] = right; + return lb_emit_runtime_call(p, runtime_procedure, args); + } + + + if (is_type_cstring(a) ^ is_type_cstring(b)) { left = lb_emit_conv(p, left, t_string); right = lb_emit_conv(p, right, t_string); } -- cgit v1.2.3