stage2 提供词法分析器通过与stage1的差异测试 stage1提供数组到切片的隐式转换

This commit is contained in:
zzy committed 2026-09-18 19:40:10 +08:00
1 parent c30143609a
commit bb9d0a9f18
13 files changed
+1275 -52

No files matched your search

+40
View File
@@ -1138,6 +1138,46 @@ static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
usize nelems = vec_size(n->array_literal.elems);
/* [N]T -> []T:物化数组到局部存储,再构造 {ptr, len} 切片。 */
spl_lang_type_node_t *sln = spl_lang_type_node(a->sema->type, node_lang(a, n));
if (sln && sln->kind == SPL_LANG_TYPE_SLICE) {
spl_type_id_t elem_ir = to_ir_type(a, sln->extra.elem);
if (!elem_ir)
Panic("array literal slice element has no ir type");
spl_lang_type_id_t usize_lang = spl_lang_make_int(a->sema->type, sizeof(void *) * 8, 0);
spl_type_id_t usize_ir = to_ir_type(a, usize_lang);
spl_type_id_t ptr_ir = spl_type_builder_ptr(&a->sema->type->ir, elem_ir);
spl_ir_node_ref_t base = 0;
if (nelems == 0) {
base = spl_ir_builder_type_const_ptr(a->ir, ptr_ir, NULL);
} else {
spl_type_id_t arr_ir =
spl_type_builder_array(&a->sema->type->ir, elem_ir, nelems);
spl_ir_node_ref_t slot =
spl_ir_builder_mem_alloca(a->ir, arr_ir, const_usize(a, 1));
for (usize i = 0; i < nelems; ++i) {
spl_ir_node_ref_t fptr =
spl_ir_builder_mem_field(a->ir, arr_ir, slot, i);
spl_ir_node_ref_t v = emit_expr(a, vec_at(n->array_literal.elems, i));
if (!v)
Panic("array element emit failed");
spl_ir_builder_mem_store(a->ir, elem_ir, fptr, v);
}
base = spl_ir_builder_mem_field(a->ir, arr_ir, slot, 0);
}
if (!base)
Panic("array literal slice base failed");
spl_ir_node_ref_t len = spl_ir_builder_type_const_int(a->ir, usize_ir, nelems);
spl_ir_node_ref_t node = spl_ir_builder_agg_construct(a->ir, t);
if (!node)
Panic("agg_construct failed for array-to-slice");
spl_ir_builder_agg_construct_field(a->ir, node, base);
spl_ir_builder_agg_construct_field(a->ir, node, len);
return node;
}
spl_ir_node_ref_vec_t field_refs;
vec_init(field_refs);
for (usize i = 0; i < nelems; ++i) {