Files
hakorune/docs/development/current/main/phase84-case-d-summary.md

166 lines
6.0 KiB
Markdown
Raw Normal View History

# Phase 84: Case D 分析サマリー(エグゼクティブサマリー)
## TL;DR
**現状**: 4 件の Case D 失敗Phase 83 + Phase 84-1 + Phase 84-2 + Phase 84-3 実装後)
**主要原因**: BoxCall/Await/QMark の戻り値型が `value_types` に未登録なため、PHI/Copy グラフの「base 型」が欠落していること。
**対応状況**:
- Phase 83: MethodReturnHintBoxP3-D実装で 20 件 → 15 件
- Phase 84-1: Const 命令型アノテーション追加で 15 件 → 12 件
- Phase 84-2: CopyTypePropagator 導入で 12 件 → 9 件
- Phase 84-3: PhiTypeResolver 導入で 9 件 → 4 件
**残タスク**: BoxCall/Await/QMark 戻り値型の登録Phase 84-4と、if_phi フォールバックの最終縮退
---
## 問題の核心
### 初期段階Const 命令の型アノテーション欠如
```rust
// Integer/Bool/Float/Null/Void は型を登録しない
pub fn emit_integer(b: &mut MirBuilder, val: i64) -> ValueId {
let dst = b.next_value_id();
b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Integer(val),
});
dst // ← value_types に何も登録していない!
}
```
### ✅ 修正版
```rust
pub fn emit_integer(b: &mut MirBuilder, val: i64) -> ValueId {
let dst = b.next_value_id();
b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Integer(val),
});
b.value_types.insert(dst, MirType::Integer); // ← この1行を追加
dst
}
```
**同様の修正を `emit_bool`/`emit_float`/`emit_null`/`emit_void` にも適用**
---
## 影響範囲
### 修正されるテスト(推定 14-16 件)
- `mir_locals_uninitialized` - `return 0` の型
- `mir_stageb_like_*_verifies` (7件) - 全て return 系
- `mir_stage1_cli_entry_like_pattern_verifies` - return 系
- 他の return リテラルを含むテスト
### 残存する問題(現時点の整理)
- **BoxCall/Await/QMark 戻り値型の未登録**
- await 構文(`test_lowering_await_expression`
- QMark (`?`) 構文(`mir_lowering_of_qmark_propagate`
- Stage1 CLI 系の BoxCall 戻り値2 テスト)
- PhiTypeResolver 自体は設計通り動作しており、base 定義BoxCall 等)に型が入っていないために Case D が残っている。
---
## 実装計画
### Phase 84-1: Const命令型アテーション完了
**Status**: ✅ 実装完了40dfbc68
**ファイル**: `src/mir/builder/emission/constant.rs`
**変更箇所**: 5 関数 × 1 行 = **5 行追加**
**効果**: Case D が 15 件 → 12 件Const 欠如グループは解消)
**所要時間**: 1-2 時間(テスト含む)
**リスク**: 極めて低いString は既に実装済み)
### Phase 84-2: Copy命令型伝播完了
**Status**: ✅ 実装完了CopyTypePropagator 導入)
**ファイル**:
- `src/mir/phi_core/copy_type_propagator.rs`(新規箱)
- `src/mir/phi_core/mod.rs`
- `src/mir/builder/lifecycle.rs`
**内容**:
- `CopyTypePropagator` が MIR 関数内の `Copy { dst, src }` を固定点ループで走査し、
`value_types[src]` の型を `value_types[dst]` に伝播Unknown のみ上書き)。
- `finalize_module` 内で return 型推論の前に実行。
**効果**:
- ベースラインテスト: 489 passed, 34 failed → 494 passed, 33 failed+5/-1
- Case D: 12 件 → 9 件(約 25% 削減)。
**箱理論チェック**:
- 単一責務Copy の型伝播のみ)、副作用は `value_types` 更新に限定、PHI/JoinIR には非依存。
### Phase 84-3: PHI型推論強化長期
**Status**: ✅ PhiTypeResolver 導入完了PHI + Copy グラフの安全な型推論)
**内容**:
- `PhiTypeResolver``Copy`/`Phi` グラフを DFS/BFS で辿り、末端の base 定義型が 1 種類に揃う場合にのみ MirType を返す。
- lifecycle.rs の return 型推論フローに統合し、P3-D/Const/CopyTypePropagator で埋まらないケースの一部を吸収。
**効果**:
- Case D: 9 件 → 4 件(約 56% 削減)。
- 残り 4 件は BoxCall/Await/QMark 戻り値型が `value_types` に登録されていないため、PhiTypeResolver から見ても「base 型が不明」のケースとして扱われている。
---
## 推奨アクション
1. **Phase 84-1 は完了済み**
- Const 命令の型アノテーション欠如グループは解消済み。
2. **Phase 84-2 も完了済み**
- Copy チェーンだけで説明できる Case D は削減済みで、残りは PHI 主体の複雑ケースに集中。
3. **Phase 84-3PhiTypeResolverは導入済み**
- PHI + Copy グラフ上で安全に決められるケースは吸収済みで、残り 4 件は「base 定義側に型がない」という別レイヤの問題に集約された。
---
## 期待される最終結果
| Phase | Case D 件数 | 修正率 | 備考 |
|-------|------------|--------|-----|
| Phase 82 終了時 | 20 件 | - | lifecycle 修正後 |
| Phase 83 後 | 15 件 | 25% | MethodReturnHintBoxP3-D |
| Phase 84-1 後 | 12 件 | 40% | Const 型アノテーション |
| Phase 84-2 後 | 9 件 | 55% | CopyTypePropagator |
| Phase 84-3 後 | 4 件 | 80% | PhiTypeResolverPHI + Copy グラフ) |
| Phase 84-4 後(目標) | 0-2 件 | 90-100% | BoxCall/Await/QMark 型登録 |
**最終目標**: Case D を 0-2 件まで縮小し、`infer_type_from_phi*` を本線から外せる状態にする。
---
## Phase 84-4 方針(案)
- Phase 84-4-A: dev フォールバック
- 開発時のみ PHI fallback を許可するガードを追加し、自分用のデバッグラインを確保。
- Phase 84-4-B: BoxCall 戻り値型の登録
- BoxCall lowering で戻り値型を `value_types` に登録し、Stage1 CLI 系 2 テストを根本解決。
- Phase 84-4-C: Await/QMark 戻り値型の処理
- await/QMark lowering で中間値の型を登録し、await/QMark テスト 2 件を解消。
---
## 詳細分析
完全な分析レポートは以下を参照:
- [phase84-case-d-detailed-analysis.md](./phase84-case-d-detailed-analysis.md)