From 23236c88eae668c793a576fcb0f26151081dcd42 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 15 Oct 2026 22:26:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(lifetime):=20=E8=A3=B8=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=88=A4=E5=80=BC=E6=8B=B7=E8=B4=9D=E4=B8=8D=E5=86=8D=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E7=B1=BB=E5=9E=8B=E6=89=93=E5=8D=B0=E6=AF=94=E8=BE=83?= =?UTF-8?q?=20-=20=E4=BF=AE=20CAM=20=3D=20V3(...)=20=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=E8=AF=AF=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/lib/core/Gen/AssignGenMixin.vp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/App/lib/core/Gen/AssignGenMixin.vp b/App/lib/core/Gen/AssignGenMixin.vp index 7809a84..142b0a0 100644 --- a/App/lib/core/Gen/AssignGenMixin.vp +++ b/App/lib/core/Gen/AssignGenMixin.vp @@ -1142,12 +1142,25 @@ novirtual class AssignGenMixin: if ct_ty is not None: ct_en: GenTypes.StructEntry* = self.Gen.StructGen.find_struct_by_type(ct_ty) if ct_en is None or ct_en.HasNew == 0: - # 裸构造 `T(...)` 的存储是本帧入口 alloca,但**目标位置是同型聚合值**时语义是 - # 值拷贝:返回/写入会把整块聚合复制出去,拷贝与源帧无关 —— 判 LIFE_VALUE - # (与上方裸数组名的口径一致)。只有裸构造退让成指针的位置(`&T(...)`、指针目标、 - # 异型聚合目标)才交出本帧地址,判 LIFE_FRAME。 + # 裸构造 `T(...)` 的存储是本帧入口 alloca,但只要**目标位置是值类型** + # (函数按值返回 / 值类型槽 / 全局值存储),写入就是整块聚合拷贝,与源帧无关 + # ⇒ LIFE_VALUE(与上方 Name 分支同口径)。 + # 此前还额外要求 `_stg_ty_equal(ct_ty, target_ty)`,而它按类型打印文本比较 + # (见本类 _stg_ty_equal),`%V3` 带模块 sha1 前缀时经常不相等 ⇒ 于是 + # `CAM = V3(...)`(模块级全局赋值)被误判成"把本帧地址交给模块级全局"。 + # 目标位置是地址(`&T(...)`、指针目标、指针槽)才交出本帧地址 ⇒ LIFE_FRAME。 if target_ty is not None and self.Gen.ExprGenBase.is_ptr_type(target_ty) == 0: - if self._stg_ty_equal(trans.Pool, ct_ty, target_ty) != 0: return GenTypes.LIFE_VALUE + return GenTypes.LIFE_VALUE + # [TEMP-DIAG] 裸构造仍判帧生命期时的输入快照(定位完删除) + hv: int = -1 + if ct_en is not None: hv = ct_en.HasNew + tptr: int = -1 + if target_ty is not None: tptr = self.Gen.ExprGenBase.is_ptr_type(target_ty) + fn_c: str = None + if trans._cur_func is not None: fn_c = mlirlite.function_get_name(trans._cur_func) + if fn_c is None: fn_c = "?" + stdio.printf("[CTOR-DIAG] fn=%s ctor=%s hasnew=%d tptr=%d tgt_none=%d\n", + fn_c, ctor_nm, hv, tptr, 1 if target_ty is None else 0) return GenTypes.LIFE_FRAME return GenTypes.LIFE_UNKNOWN if k == ast.ASTKind.New: