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.