feat(switch): switch 允许重复 case 标签(match 仍禁止)
- HandlesMatch / MatchGenMixin:值标签去重仅对 match 生效;switch 允许重复 case 标签(按书写顺序,先出现者生效);通配臂多个(default / case _)仍 fail-fast - wiki/07-control-flow.md 同步该语义
This commit is contained in:
1 parent
d6eefcbece
commit
2f70bd2733
1 file changed
+7
-6
@@ -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
|
||||
|
||||
Reference in new issue
Block a user