From ea5175d865c2034b033ebf5653d83638f10bba54 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 2 May 2026 12:11:39 +0100 Subject: [PATCH] Support `s: [2]u16 = "hi"` --- src/check_expr.cpp | 19 +++++++++++++++++++ src/llvm_backend_const.cpp | 21 +++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 95b5c6f15..b81052590 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3449,10 +3449,23 @@ gb_internal bool check_is_castable_to(CheckerContext *c, Operand *operand, Type if (is_constant && is_type_untyped(src) && is_type_string(src)) { if (is_type_u8_array(dst)) { + GB_ASSERT(operand->value.kind == ExactValue_String); String s = operand->value.value_string; return s.len == dst->Array.count; } + if (is_type_u16_array(dst)) { + if (operand->value.kind == ExactValue_String16) { + String16 s = operand->value.value_string16; + return s.len == dst->Array.count; + } + GB_ASSERT(operand->value.kind == ExactValue_String); + String16 s = string_to_string16(heap_allocator(), operand->value.value_string); + defer (gb_free(heap_allocator(), s.text)); + + return s.len == dst->Array.count; + } if (is_type_rune_array(dst)) { + GB_ASSERT(operand->value.kind == ExactValue_String); String s = operand->value.value_string; return gb_utf8_strnlen(s.text, s.len) == dst->Array.count; } @@ -4963,6 +4976,12 @@ gb_internal void convert_to_typed(CheckerContext *c, Operand *operand, Type *tar if (rune_count == t->Array.count) { break; } + } else if (is_type_u16_array(t)) { + String16 s = string_to_string16(heap_allocator(), operand->value.value_string); + defer (gb_free(heap_allocator(), s.text)); + if (s.len == t->Array.count) { + break; + } } } else if (operand->value.kind == ExactValue_String16) { String16 s = operand->value.value_string16; diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 0156e2359..b5429ae19 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -1026,6 +1026,27 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } GB_ASSERT(offset == s.len); + res.value = llvm_const_array(m, et, elems, cast(unsigned)count); + return res; + } else if (is_type_u16_array(type) && (value.kind == ExactValue_String || value.kind == ExactValue_String16) && !is_type_u8(core_array_type(type))) { + i64 count = type->Array.count; + Type *elem = type->Array.elem; + LLVMTypeRef et = lb_type(m, elem); + + String16 s = {}; + if (value.kind == ExactValue_String16) { + s = value.value_string16; + } else { + s = string_to_string16(temporary_allocator(), value.value_string); + } + + LLVMValueRef *elems = gb_alloc_array(permanent_allocator(), LLVMValueRef, cast(isize)count); + + for (isize i = 0; i < s.len; i++) { + elems[i] = LLVMConstInt(et, s.text[i], false); + + } + res.value = llvm_const_array(m, et, elems, cast(unsigned)count); return res; } else if (is_type_u8_array(type) && value.kind == ExactValue_String) {