from stdint import * import retdep2 # ============================================================================= # 负向工程(**应当编译失败**):A2 **跨模块** `@life(ret(...))` —— 契约经 .vpi 的 `escr=` # # 被调者定义在 retdep2.vp,契约(含 ret_kind)只能经对方 .vpi 行尾的 `escr=` 传来; # 本文件里它的本地契约表必然为空 → 命中跨模块回退路径。 # # 本工程验:跨模块声明为 `borrows=x` 的返回值(生命期 = 实参 = 本帧)被写进长命存储 # 时必须被拒。期望报错:LifetimeError(`a longer-lived field/element`)。 # # 隔离性:IdentBorrow 带 `@life(noescape(x))`,"实参逃逸"那条路径被清掉, # 故唯一的报错来源是 .vpi 的 `escr=` → ret(borrows=x) → 结果 LIFE_FRAME。 # ============================================================================= novirtual class Holder: p: int* # 唯一用例:跨模块 ret(borrows=x) 的结果存进**堆对象**字段 → 左值长命、右值本帧 def CaseBorrow() -> int: h: Holder* = new heap hlife Holder() l: int* = new stack int h.p = retdep2.IdentBorrow(l) # ❌ 期望 LifetimeError return 0 export def main() -> int: CaseBorrow() return 0 # ----------------------------------------------------------------------------- # 对照用例(把 main 里的 CaseBorrow() 换成本函数即可,一次只开一条): # # def CaseFrame() -> int: # h: Holder* = new heap hlife Holder() # h.p = retdep2.FrameRet() # ❌ 期望 LifetimeError # return 0 # -----------------------------------------------------------------------------