From 007730bfbcf7508552d370e8a658e14313a4694c Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Wed, 25 Sep 2024 23:42:35 +0200 Subject: [PATCH] Fix for crash when emitting a comparison between a constant array and a non-constant value. --- src/llvm_backend_expr.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 58467db2e4a..608be4947f5 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2555,17 +2555,21 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left if (are_types_identical(a, b)) { // NOTE(bill): No need for a conversion - } else if (lb_is_const(left) || lb_is_const_nil(left)) { + } else if ((lb_is_const(left) && !is_type_array(left.type)) || lb_is_const_nil(left)) { + // NOTE(karl): !is_type_array(left.type) is there to avoid lb_emit_conv + // trying to convert a constant array into a non-array. In that case we + // want the `else` branch to happen, so it can try to convert the + // non-array into an array instead. + if (lb_is_const_nil(left)) { return lb_emit_comp_against_nil(p, op_kind, right); } left = lb_emit_conv(p, left, right.type); - } else if (lb_is_const(right) || lb_is_const_nil(right)) { + } else if ((lb_is_const(right) && !is_type_array(right.type)) || lb_is_const_nil(right)) { if (lb_is_const_nil(right)) { return lb_emit_comp_against_nil(p, op_kind, left); } right = lb_emit_conv(p, right, left.type); - } else { Type *lt = left.type; Type *rt = right.type;