From 934708b20612b7a2be3ad7f42336303d191f498b Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 8 Oct 2026 20:03:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(type):=20=E6=95=B0=E7=BB=84=E9=80=80?= =?UTF-8?q?=E8=AE=A9=E8=B1=81=E5=85=8D=E6=8F=90=E5=88=B0=E7=BA=A7=E6=95=B0?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E4=B9=8B=E5=89=8D=EF=BC=8C=E4=BF=AE=20[N]str?= =?UTF-8?q?=20=E5=BD=A2=E5=8F=82=E8=A2=AB=E8=AF=AF=E5=88=A4=20CastError?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 形参侧 CArray 按 C 语义退让成元素指针 str*(级数 2),实参仍是 [N]str 的数组地址(级数 1)→ _ptr_cast_reason 先查级数就判 PC_DEPTH,_pointee_convert_reason 里那条既有数组退让豁免成了死代码。元素为 i8 时级数不变所以一直没暴露,元素本身是指针才炸(现场:includes/tomllib _parse_key_path 的 segs)。 --- App/lib/core/Gen/Expr/ExprGenBase.vp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/App/lib/core/Gen/Expr/ExprGenBase.vp b/App/lib/core/Gen/Expr/ExprGenBase.vp index d1e2bff..70c3581 100644 --- a/App/lib/core/Gen/Expr/ExprGenBase.vp +++ b/App/lib/core/Gen/Expr/ExprGenBase.vp @@ -400,6 +400,13 @@ novirtual class ExprGenBase: slev: int = self.get_ptr_level(src_ty) dlev: int = self.get_ptr_level(dst_ty) if slev == 0 or dlev == 0: return PC_OK + # 豁免 0(必须放在级数检查**之前**):固定数组退让 `[N]T* -> T*`(C 语义:数组名退让成 + # 首元素指针)。元素是 i8 时级数不变(1→1,恰好由"全类型指针通配"放行),但元素本身 + # 是指针时级数会 +1(`[N]str` -> `str*` 即 `Ptr([N]i8*) -> Ptr(i8*)`:1→2), + # 级数检查会先判成 PC_DEPTH,使下面 _pointee_convert_reason 里那条既有豁免永远够不到 + # (死代码)。现场:includes/tomllib `_parse_key_path(s, segs: [N]str, cap)` —— 形参按 + # C 语义退让成 `str*`(FuncGenDef 的 Array 形参退让),实参仍是 `[N]str` 的数组地址。 + if self._is_array_decay(pool, src_ty.Pointee, dst_ty.Pointee) != 0: return PC_OK # Different depth: forbidden regardless of pointee. if slev != dlev: return PC_DEPTH # Rule 4: identical types (same depth and pointee) are not a conversion.