Files
ViperC/App/lib/core/Gen/Call
TermiNexus 07f2f2e9fc fix(transpyv): CallGenCBuiltin 的 clobbers 改为单级 t.CPtr,并同步该文件语法迁移
【类别 c 源码违规】clobbers 声明的指针层数与 alloc/memset 不一致。

现象:
  翻译 App/lib/core/Gen/Call/CallGenCBuiltin.vp 报
  「指针隐式转换已禁止(层数不同):不能用指针类型 i8* 初始化 clobbers: i8**」
  出错表达式 'pool.alloc(8 * ASM_MAX_CLOBBERS)'(Call 形态,CallGenCBuiltin.vp:955:33)。

判据(三条,缺一不可):
  1. memhub.MemBuddy.alloc(size: sizet) -> t.CPtr(includes/memhub.vp)即 i8* 单级;
  2. str | t.CPtr 是 i8**(CChar + PtrCount 2),即字符串指针数组视图;
  3. MemoryOps._ClassifyPtrImplicitConvert 判定顺序为**先比层数**,层数不同直接禁,
     通用指针通配(void*)不跨层。
  故 i8* 结果不能隐式初始化 i8** 变量 —— 与是否同名 str 无关。

取证补充:同函数下一行 string.memset(clobbers, 0, ...) 首参同样是 t.CPtr
  (includes/string.vp: memset(ptr: t.CPtr, value: int, num: sizet)),
  即便只给 clobbers 加 cast,memset 一样会挂 —— 必须把声明本身改回单级。

修法:clobbers 声明改回单级裸缓冲 t.CPtr,每槽按 8 字节字符串指针的写入沿用
  下方既有的显式 cast 槽视图写法
  (cl_ptr: str | t.CPtr = (str | t.CPtr)(cl_addr)),
  与 includes/_dict.vp 的「缓冲单级 t.CPtr、槽视图 str | t.CPtr 显式 cast」范式一致。
  此改**不引入新 cast、不绕过检查**,只是把声明修正到与真实分配/清零层数相符。

同类扫描:全 App + includes 内 str | t.CPtr = *.alloc(...) 形态仅此一处;
  includes/sys.vp 两处早已是显式 str*(...) 转换。

同时并入本文件他人已完成的语法迁移(同文件合并提交):
  - 常量声明 t.CDefine: T = 值 → define NAME = 值 语法糖(_CEXPORT_MAX /
    ASM_MAX_OPERANDS / ASM_MAX_CLOBBERS / ASM_TEXT_BUF_SIZE / ASM_CONST_BUF_SIZE /
    ASM_ARGS_BUF_SIZE / ASM_LINE_BUF_SIZE / LLVMIR_MAX_OPS / LLVMIR_TEMPLATE_BUF);
  - @t.NoVTable + class → novirtual class;
  - 删除常量块内已失效的注释与多余空行。

1 file changed, 17 insertions(+), 18 deletions(-)
2026-09-29 14:47:42 +08:00
..