From d1dd6de070868a92fe3426a363cec0b5cabd81ed Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 15 Oct 2026 21:59:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(lifetime):=20=E7=9B=AE=E6=A0=87=E4=B8=BA?= =?UTF-8?q?=E5=80=BC=E7=B1=BB=E5=9E=8B=E5=8D=B3=E5=88=A4=20LIFE=5FVALUE(?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E8=A6=81=E6=B1=82=E6=BA=90=E9=9D=9E=E6=8C=87?= =?UTF-8?q?=E9=92=88)=20-=20class=20=E5=B1=80=E9=83=A8=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=86=85=E9=83=A8=E4=B8=BA=E6=8C=87=E9=92=88=E6=A7=BD=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=20stars=20=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 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/App/lib/core/Gen/AssignGenMixin.vp b/App/lib/core/Gen/AssignGenMixin.vp index cfef41a..7809a84 100644 --- a/App/lib/core/Gen/AssignGenMixin.vp +++ b/App/lib/core/Gen/AssignGenMixin.vp @@ -1082,9 +1082,12 @@ novirtual class AssignGenMixin: # 此前只覆盖「裸数组名」,于是 `col: V3 = V3(...)` 后 `return col` 落到 get_var_life # 读回本帧 LIFE_FRAME,被 check_return_frame_decl 误报 LifetimeError。 # 只排除"变量值本身或目标位置是地址"的情形:`p: V3*` 的 `return p` 仍判帧生命期。 - elif (inner is not None and target_ty is not None - and self.Gen.ExprGenBase.is_ptr_type(inner) == 0 - and self.Gen.ExprGenBase.is_ptr_type(target_ty) == 0): + # 目标位置是**值类型**(函数按值返回、赋值给值类型槽)时,读出的值会整块拷贝到目标 + # ⇒ LIFE_VALUE。这里**不要求变量本身也非指针**:class 的局部变量内部是"指针槽" + # (诊断实证:stars 的 col 为 iptr=1,而 clmp 的形参 a 为 iptr=0,两者表示不同), + # 但返回类型是聚合值(rvkind=4)时会做值拷贝,交出的仍是拷贝而非栈地址。 + # 反例仍拦:`p: V3*` 的 `return p`(target 是指针,tptr=1)不进入本分支,仍判帧生命期。 + elif target_ty is not None and self.Gen.ExprGenBase.is_ptr_type(target_ty) == 0: res = GenTypes.LIFE_VALUE hit = 4 else: