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