Phase 84-4-B で Case D を 0件に削減完了したことにより、 if_phi.rs のレガシーフォールバックが完全に不要になったため削除。 主な変更: - if_phi.rs 削除(339行) - test_utils.rs 新規作成(テスト専用ユーティリティ分離、127行) - lifecycle.rs: if_phi 呼び出し削除、Phase 84-5 安全ガード追加 - env.rs: phi_fallback_disabled() を常に true に変更 - テスト: A/B テスト → GenericTypeResolver 単独テストに変更 検証結果: - Case D: 0件(完全解消継続) - Tests: 498 passed(Phase 84-4: 497 から +1) Phase 84 プロジェクト完全達成: 15件 → 0件(100%削減) 純削減: 220行 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
7.1 KiB
7.1 KiB
Phase 84: Case D 分析サマリー(エグゼクティブサマリー)
TL;DR
現状: Case D 失敗 0 件(Phase 83〜84-4 実装後、dev ガード付きテストで panic なし)
主要原因(解消済み):
- Const 命令の型アノテーション欠如(Phase 84-1 で修正)
- Copy チェーンでの型伝播不足(Phase 84-2 で修正)
- PHI + Copy グラフ上の型集約不足(Phase 84-3 で PhiTypeResolver 導入)
- BoxCall/Await/QMark の戻り値型未登録(Phase 84-4-B で修正)
対応状況:
- Phase 83: MethodReturnHintBox(P3-D)実装で 20 件 → 15 件
- Phase 84-1: Const 命令型アノテーション追加で 15 件 → 12 件
- Phase 84-2: CopyTypePropagator 導入で 12 件 → 9 件
- Phase 84-3: PhiTypeResolver 導入で 9 件 → 4 件
- Phase 84-4-B: BoxCall 戻り値型登録で 4 件 → 0 件
次タスク候補: if_phi フォールバックの完全削除(Phase 84-5 / Phase 82 最終仕上げ)
問題の核心
(初期段階)Const 命令の型アノテーション欠如
// 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 に何も登録していない!
}
✅ 修正版
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 リテラルを含むテスト
残存する問題(Phase 84 終了時点)
- Case D panic は dev ガード付きテストでも 0 件。
- 残っている課題は「if_phi フォールバックそのものの削除」と、その前提となる
infer_type_from_phi*callsite の整理のみ。
実装計画
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.rssrc/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 型が不明」のケースとして扱われている。
Phase 84-4: BoxCall/Await/QMark 戻り値型登録(完了)
Status: ✅ 実装完了(Phase 84-4-B)
ファイル:
src/mir/builder/utils.rs(新規)infer_boxcall_return_type()ヘルパー関数を追加(約 75 行)- 27 個のビルトイン Box メソッドに対する戻り値型マッピングを集約
- BoxCall lowering 呼び出し元(
emit_box_or_plugin_call相当)で、戻り値型をvalue_typesに登録
対応メソッド(抜粋):
- StringBox / IntegerBox / BoolBox / ArrayBox / MapBox / Result-like(QMark 相当)/ Stage1CliBox など、計 27 メソッド。
効果:
NYASH_PHI_FALLBACK_DISABLED=1 cargo test --release --lib実行時の Case D panic が 4 件 → 0 件に。- Await/QMark 系テストは BoxCall 経路の型登録で全て解消され、追加の Await 専用実装は不要となった。
推奨アクション
-
Phase 84-1 は完了済み
- Const 命令の型アノテーション欠如グループは解消済み。
-
Phase 84-2 も完了済み
- Copy チェーンだけで説明できる Case D は削減済みで、残りは PHI 主体の複雑ケースに集中。
-
Phase 84-3(PhiTypeResolver)は導入済み
- PHI + Copy グラフ上で安全に決められるケースは吸収済みで、残り 4 件は「base 定義側に型がない」という別レイヤの問題に集約された。
期待される最終結果
| Phase | Case D 件数 | 修正率 | 備考 |
|---|---|---|---|
| Phase 82 終了時 | 20 件 | - | lifecycle 修正後 |
| Phase 83 後 | 15 件 | 25% | MethodReturnHintBox(P3-D) |
| Phase 84-1 後 | 12 件 | 40% | Const 型アノテーション |
| Phase 84-2 後 | 9 件 | 55% | CopyTypePropagator |
| Phase 84-3 後 | 4 件 | 80% | PhiTypeResolver(PHI + Copy グラフ) |
| Phase 84-4 後 | 0 件 | 100% | BoxCall/Await/QMark 型登録 |
最終目標: Case D を 0 件にし、infer_type_from_phi* を本線から外せる状態を達成済み。次ステップで if_phi フォールバック(約 300 行)を構造的に削除する。
Phase 84-4 方針(案)
- Phase 84-4-A: dev フォールバック
- 開発時のみ PHI fallback を許可するガードを追加し、自分用のデバッグラインを確保。
- Phase 84-4-B: BoxCall 戻り値型の登録
- BoxCall lowering で戻り値型を
value_typesに登録し、Stage1 CLI 系 2 テストを根本解決。
- BoxCall lowering で戻り値型を
- Phase 84-4-C: Await/QMark 戻り値型の処理
- await/QMark lowering で中間値の型を登録し、await/QMark テスト 2 件を解消。
詳細分析
完全な分析レポートは以下を参照: