59 lines
2.6 KiB
Markdown
59 lines
2.6 KiB
Markdown
|
|
# Phase 284: Return as ExitKind SSOT(patternに散らさない)
|
|||
|
|
|
|||
|
|
Status: Planned (design-first)
|
|||
|
|
|
|||
|
|
## Goal
|
|||
|
|
|
|||
|
|
`return` を “pattern 個別の特例” として増やさず、`ExitKind::Return` と `compose::*` / `emit_frag()` に収束させる。
|
|||
|
|
移行期間中の検出穴(Ok(None) による黙殺)を消し、Fail-Fast を構造で担保する。
|
|||
|
|
|
|||
|
|
## SSOT References
|
|||
|
|
|
|||
|
|
- Frag/ExitKind 設計: `docs/development/current/main/design/edgecfg-fragments.md`
|
|||
|
|
- Composition API: `src/mir/builder/control_flow/edgecfg/api/compose.rs`
|
|||
|
|
- Terminator emission: `src/mir/builder/control_flow/edgecfg/api/emit.rs`(`emit_frag()`)
|
|||
|
|
- Router SSOT(SSOT=extract / safety valve): `docs/development/current/main/phases/phase-282/README.md`
|
|||
|
|
|
|||
|
|
## Problem(移行期間の弱さ)
|
|||
|
|
|
|||
|
|
- Pattern 単位で `return` を “未対応” にすると、検出戦略(Ok(None)/Err)次第で **静かに別経路へ落ちる**。
|
|||
|
|
- その結果、同じソースでも「どの lowering が `return` を解釈したか」が曖昧になり、SSOT が割れる。
|
|||
|
|
|
|||
|
|
## Core SSOT(決めること)
|
|||
|
|
|
|||
|
|
### 1) 返り値の意味(ExitKind)
|
|||
|
|
|
|||
|
|
- `return expr` は `ExitKind::Return` として表現する。
|
|||
|
|
- 返り値(ValueId)は `EdgeArgs` で運ぶ(Return edge が value を持つ)。
|
|||
|
|
- Return は **必ず emit 側で terminator になる**(pattern 側で命令を直に生成しない)。
|
|||
|
|
|
|||
|
|
### 2) Detect の境界(Ok(None) / Err)
|
|||
|
|
|
|||
|
|
- `Ok(None)`: 一致しない(次の extractor へ)
|
|||
|
|
- `Err(...)`: 一致したが未対応(close-but-unsupported)→ **Fail-Fast**
|
|||
|
|
|
|||
|
|
Phase 284 の完了条件は「`return` を含むケースが close-but-unsupported ではなく SSOT 経路で処理される」状態に寄せること。
|
|||
|
|
|
|||
|
|
### 3) 実装の集約点(どこに寄せるか)
|
|||
|
|
|
|||
|
|
- `return` の lowering は **ExitKind + compose + emit_frag** に集約する。
|
|||
|
|
- pattern の extractor は “認識” のみ(SSOT=extract)。`return` の解釈ロジックを増やさない。
|
|||
|
|
|
|||
|
|
## Scope
|
|||
|
|
|
|||
|
|
### P0(docs-only)
|
|||
|
|
|
|||
|
|
- `return` を ExitKind として扱う SSOT を文章で固定する(本ファイル + 参照先リンク)。
|
|||
|
|
- 移行期間のルール(Ok(None)/Err の境界、黙殺禁止)を Phase 282 と整合させる。
|
|||
|
|
|
|||
|
|
### P1+(code)
|
|||
|
|
|
|||
|
|
- `return` を含む loop body を、JoinIR/Plan のどちらの経路でも **同じ ExitKind::Return** に落とす。
|
|||
|
|
- VM/LLVM の両方で、`return` を含む fixture を smoke 化して SSOT を固定する。
|
|||
|
|
|
|||
|
|
## Acceptance
|
|||
|
|
|
|||
|
|
- P0: `return` の SSOT(ExitKind/compose/emit)と detect 境界が明文化されている
|
|||
|
|
- P1+: `return` を含む loop fixture が VM/LLVM で同一結果になり、smoke で固定されている
|
|||
|
|
|