From a3bb62f2c30ea447f36c6a10165c636fb6a3bac0 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 3 Oct 2026 00:18:55 +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 同步该语义 --- App/lib/core/Gen/MatchGenMixin.vp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/App/lib/core/Gen/MatchGenMixin.vp b/App/lib/core/Gen/MatchGenMixin.vp index 0121786..70561cc 100644 --- a/App/lib/core/Gen/MatchGenMixin.vp +++ b/App/lib/core/Gen/MatchGenMixin.vp @@ -90,10 +90,11 @@ novirtual class MatchGenMixin: m_node: ast.Match* = ast.Match*(node) - # 重名 case 检测(fail-fast):C 的 switch 不允许重复 case 标签(重复标签让 - # 某个臂永远不可达,且常意味着漏改的分支);通配臂(match 的 `case _` / - # switch 的 `default`)只允许一个。在任何 IR 产出之前检查,保证报错即终止。 - # 报文前缀按 is_switch 区分(switch / match),便于定位。 + # 重名 case 检测(fail-fast):**match 不允许重复 case 标签**(重复标签让 + # 某个臂永远不可达,且常意味着漏改的分支);**switch 允许重复标签**(按书写 + # 顺序,先出现者生效),故仅对 match 做值标签去重。 + # 通配臂(match 的 `case _` / switch 的 `default`)两者都只允许一个。 + # 在任何 IR 产出之前检查,保证报错即终止。报文前缀按 is_switch 区分。 kind_label: str = "match" default_label: str = "`case _`" if m_node.is_switch != 0: @@ -112,7 +113,7 @@ novirtual class MatchGenMixin: if dpat.kind() == ast.ASTKind.MatchAs \ and rawptr[ast.MatchAs](dpat).pattern is None: default_cnt = default_cnt + 1 - else: + elif m_node.is_switch == 0: dcj: int = dci + 1 while dcj < ccn: dcase2: ast.AST* = cases_chk.get(dcj) @@ -120,7 +121,7 @@ novirtual class MatchGenMixin: dpat2: ast.AST* = rawptr[ast.MatchCase](dcase2).pattern if self._case_label_same(dpat, dpat2) != 0: self.Gen.TypeGenErr.fatal_error(dcase2, - f"{kind_label} 出现重名 case:第 {dci} 与第 {dcj} 个 case 的标签相同(C switch 不允许重复 case 标签)", + f"match 出现重名 case:第 {dci} 与第 {dcj} 个 case 的标签相同(match 不允许重复 case 标签)", "SyntaxError") dcj = dcj + 1 dci = dci + 1