# Phase 282 P9a 完了 (Scope-Limited Integration) ## 実装内容 - **common_helpers.rs 作成**: 4グループの共通ヘルパー統合 (316行) - Group 1: Control Flow Counting (count_control_flow - 汎用カウンター) - Group 2: Control Flow Detection (has_break/continue/return_statement) - Group 3: Condition Validation (extract_loop_variable, is_true_literal) - Group 4: Pattern5専用ヘルパー (validate_continue_at_end, validate_break_in_simple_if) - **Pattern統合完了**: Pattern5 → Pattern4 → Pattern2 → Pattern1 - Pattern5: ~90行削減 (5 tests PASS) - Pattern4: ~66行削減 (5 tests PASS) - Pattern2: ~67行削減 (4 tests PASS) - Pattern1: ~28行削減 (3 tests PASS) - Pattern3: 別フェーズに延期(pattern固有ロジック除外) ## 成果 - **コード削減**: ~251行(Pattern3除く、total ~400行見込み) - **テスト**: 40 unit tests PASS (23 common_helpers + 17 extractors) - **スモークテスト**: 45 PASS, 1 pre-existing FAIL(退行ゼロ) - **ビルド警告**: 130 → 120 (-10) ## USER CORRECTIONS適用済み 1. ✅ スコープ限定(共通ロジックのみ、pattern固有除外) 2. ✅ Placeholder禁止(SSOT違反排除) 3. ✅ 統合順序変更(Pattern3を最後/別フェーズへ) ## 追加ドキュメント - Phase 284 計画追加(Return as ExitKind SSOT) - 10-Now.md, 30-Backlog.md 更新 🎯 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
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 で固定されている