From 2f70bd2733a218d414e844c77ba470b112eedf10 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 3 Oct 2026 00:18:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(switch):=20switch=20=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=20case=20=E6=A0=87=E7=AD=BE=EF=BC=88match=20?= =?UTF-8?q?=E4=BB=8D=E7=A6=81=E6=AD=A2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - HandlesMatch / MatchGenMixin:值标签去重仅对 match 生效;switch 允许重复 case 标签(按书写顺序,先出现者生效);通配臂多个(default / case _)仍 fail-fast - wiki/07-control-flow.md 同步该语义 --- lib/core/Handles/HandlesMatch.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/core/Handles/HandlesMatch.py b/lib/core/Handles/HandlesMatch.py index 6c728ef..30d3484 100644 --- a/lib/core/Handles/HandlesMatch.py +++ b/lib/core/Handles/HandlesMatch.py @@ -76,9 +76,10 @@ class MatchHandle(BaseHandle): def _HandleMatchLlvm(self, Node: ast.Match) -> None: Gen: "Translator.LlvmGen" = self.Trans.LlvmGen - # 重名 case 检测(fail-fast):C 的 switch 不允许重复 case 标签——重复标签会让 - # 某个臂永远不可达,且通常意味着漏改的分支;通配臂(match 的 `case _` / - # switch 的 `default`)同样只允许一个。 + # 重名 case 检测(fail-fast):**match 不允许重复 case 标签**——重复标签会让 + # 某个臂永远不可达,且通常意味着漏改的分支。**switch 允许重复标签**(按书写 + # 顺序,先出现者生效),故仅对 match 做值标签去重。 + # 通配臂(match 的 `case _` / switch 的 `default`)两者都只允许一个。 # 在产出任何 IR 之前检查,保证报错即终止。报文前缀按 is_switch 区分。 KindLabel: str = 'switch' if Node.is_switch else 'match' DefaultLabel: str = '`default`' if Node.is_switch else '`case _`' @@ -90,11 +91,11 @@ class MatchHandle(BaseHandle): if isinstance(case.pattern, ast.MatchAs) and case.pattern.pattern is None: DefaultCount += 1 continue - if Key in SeenLabels: + if not Node.is_switch and Key in SeenLabels: from lib.core.LLVMCG.FuncGen import FailFastError raise FailFastError( - f"{KindLabel} 出现重名 case:标签 '{Key}' 已在第 {SeenLabels[Key]} 个 case 使用," - f"第 {ci} 个 case 重复(C switch 不允许重复 case 标签)") + f"match 出现重名 case:标签 '{Key}' 已在第 {SeenLabels[Key]} 个 case 使用," + f"第 {ci} 个 case 重复(match 不允许重复 case 标签)") SeenLabels[Key] = ci if DefaultCount > 1: from lib.core.LLVMCG.FuncGen import FailFastError