diff --git a/App/lib/core/Handles/HandlesIf.vp b/App/lib/core/Handles/HandlesIf.vp index e260795..6128387 100644 --- a/App/lib/core/Handles/HandlesIf.vp +++ b/App/lib/core/Handles/HandlesIf.vp @@ -290,6 +290,10 @@ class IfHandle(HandlesBase.Mixin): llvmlite.build_cond_br(builder, cond_i1, then_bb, merge_bb) # 5. 翻译 then body + # 重置 merge 可达标志:分支内嵌套控制流会覆盖该标志,分支末尾判定依据 + # "分支最后语句的控制流状态",须防进入本 If 前的残留值污染(append90 + # 末句 If 全 return 被 fail-fast 误判"流程掉出末尾"的根因链一环) + trans._ctrl_merge_reachable = 1 llvmlite.position_at_end(builder, then_bb) body: list[ast.AST | t.CPtr] | t.CPtr = if_node.children if body is not None: @@ -302,12 +306,22 @@ class IfHandle(HandlesBase.Mixin): # then 块未终止则跳到 merge(记录 then 是否 br 到 merge) then_branches_merge: int = 0 if llvmlite.builder_cur_block_is_terminated(builder) == 0: - llvmlite.build_br(builder, merge_bb) - then_branches_merge = 1 + if trans._ctrl_merge_reachable == 0: + # 分支末尾是嵌套控制流且 merge 结构性不可达(全分支 return): + # 当前块是嵌套的 merge(无 terminator),补 unreachable 收尾。 + # 不补 br merge——否则外层 If 的"分支是否 br merge"判定把不可达 + # 分支当可达,函数末句 If 全 return 被误判"流程掉出末尾" + # (vipermath.vp atan2 根因;对齐 FuncGenDef append90 unreachable) + llvmlite.build_unreachable(builder) + else: + llvmlite.build_br(builder, merge_bb) + then_branches_merge = 1 # 6. 翻译 else body(若有) else_branches_merge: int = 0 if has_else == 1: + # 同 then:重置标志防残留(else 是普通语句时不被 then 的嵌套控制流值污染) + trans._ctrl_merge_reachable = 1 llvmlite.position_at_end(builder, else_bb) else_count: t.CSizeT = len(orelse_list) for ei in range(else_count): @@ -315,8 +329,12 @@ class IfHandle(HandlesBase.Mixin): if stmt is not None: HandlesBody.translate_stmt(trans, stmt) if llvmlite.builder_cur_block_is_terminated(builder) == 0: - llvmlite.build_br(builder, merge_bb) - else_branches_merge = 1 + if trans._ctrl_merge_reachable == 0: + # 嵌套控制流全分支 return:补 unreachable,不 br merge(同 then 分支) + llvmlite.build_unreachable(builder) + else: + llvmlite.build_br(builder, merge_bb) + else_branches_merge = 1 # 7. merge 块可达性(追加90,末句控制流收尾判定用): # 无 else 时 cond_br 直接跳 merge(恒可达);有 else 时任一分支