From c40c00f933a2ac1b5fa130702172f844dd12ac1d Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 19 Aug 2026 01:58:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(match):=20renum=20match=20merge=20=E6=A0=87?= =?UTF-8?q?=E5=BF=97=E5=A3=B0=E6=98=8E=E4=BD=9C=E7=94=A8=E5=9F=9F=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=EF=BC=88a45b806=20=E8=A1=A5=E5=85=85=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit m_merge_reach 声明放 Handle 分派函数,renum match 内引用退化为隐式全局跨 match 污染 → get_struct_name(LLVMType REnum match)收尾读到残留 1 仍 fail-fast。声明移入 _handle_renum_match 局部(rm_merge_reach),置 1 与收尾覆盖同步修正 --- App/lib/core/Handles/HandlesMatch.vp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/App/lib/core/Handles/HandlesMatch.vp b/App/lib/core/Handles/HandlesMatch.vp index 76282b6..8a48ab0 100644 --- a/App/lib/core/Handles/HandlesMatch.vp +++ b/App/lib/core/Handles/HandlesMatch.vp @@ -80,14 +80,12 @@ class MatchHandle(HandlesBase.Mixin): if builder is None or func is None: return 0 - # 追加90:match merge 可达性重置(下方 br end_bb 处置 1)。 - # 嵌套语句(case 体内的 If/While 等)翻译时会改写 _ctrl_merge_reachable, - # 用局部变量单独记录"本 match 是否有 br 进入 end_bb",收尾时覆盖, - # 消除嵌套控制流污染(_is_opaque_struct 的 case 内 if 无 else + return - # 把标志置 1,全 case return 的 match 被误判 merge 可达 → 函数收尾 - # fail-fast "流程掉出末尾",见 LLvmLiteTest/__module.vp)。 + # 追加90:match merge 可达性重置(分派前初始化为 0;各处理函数 + # renum/sequence/simple 内部用各自的局部标志记录 br end_bb 并在 + # 收尾覆盖,见 _handle_renum_match/_handle_sequence_match/ + # _handle_simple_match——切勿把标志声明在 Handle 这里(分派函数), + # 否则子函数引用的同名变量会退化为隐式全局,跨 match 互相污染)。 trans._ctrl_merge_reachable = 0 - m_merge_reach: int = 0 m_node: ast.Match | t.CPtr = (ast.Match | t.CPtr)(node) @@ -265,6 +263,12 @@ class MatchHandle(HandlesBase.Mixin): pool: memhub.MemBuddy | t.CPtr = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder func: llvmlite.Function | t.CPtr = trans._cur_func + # 局部记录本 renum match 是否有 br 进入 end_bb,收尾时覆盖 + # _ctrl_merge_reachable(case 体内嵌套 If 无 else + return 会把全局 + # 标志置 1,全 case return 的 match 被误判 merge 可达 → 函数收尾 + # fail-fast "流程掉出末尾"。声明必须在本函数内——放 Handle 分派 + # 函数里会使本函数引用退化为隐式全局,跨 match 污染)。 + rm_merge_reach: int = 0 # 0. subject 归一化:确保 subject_ptr 是指向 REnum 结构体的指针 # (对齐 TPC HandlesMatch.py:238-259 的 _HandleRenumMatchLlvm) @@ -519,7 +523,7 @@ class MatchHandle(HandlesBase.Mixin): and nb == 0: llvmlite.build_br(builder, end_bb) trans._ctrl_merge_reachable = 1 - m_merge_reach = 1 + rm_merge_reach = 1 i = i + 1 @@ -530,7 +534,7 @@ class MatchHandle(HandlesBase.Mixin): if llvmlite.builder_cur_block_is_terminated(builder) == 0: llvmlite.build_br(builder, end_bb) trans._ctrl_merge_reachable = 1 - m_merge_reach = 1 + rm_merge_reach = 1 else: # 有显式 default:翻译 default case body(找到 is_def==1 的 case) di: int = 0 @@ -556,13 +560,13 @@ class MatchHandle(HandlesBase.Mixin): if llvmlite.builder_cur_block_is_terminated(builder) == 0: llvmlite.build_br(builder, end_bb) trans._ctrl_merge_reachable = 1 - m_merge_reach = 1 + rm_merge_reach = 1 # 9. 定位到 end 块 llvmlite.position_at_end(builder, end_bb) # 用本 match 自身的 br 记录覆盖,消除 case 体内嵌套控制流对 # _ctrl_merge_reachable 的污染(全 case return 时应为不可达) - trans._ctrl_merge_reachable = m_merge_reach + trans._ctrl_merge_reachable = rm_merge_reach return 0 # ============================================================