diff --git a/src/mir/join_ir/frontend/ast_lowerer/expr.rs b/src/mir/join_ir/frontend/ast_lowerer/expr.rs index b91e3b16..46d9a6b1 100644 --- a/src/mir/join_ir/frontend/ast_lowerer/expr.rs +++ b/src/mir/join_ir/frontend/ast_lowerer/expr.rs @@ -234,11 +234,16 @@ impl AstToJoinIrLowerer { // 結果変数を割り当て let dst = ctx.alloc_var(); + // Phase 65-2-B: Box 名から型ヒントを推論 + let type_hint = + crate::mir::join_ir::lowering::type_inference::infer_box_type(box_name); + // NewBox 命令を生成 let newbox_inst = JoinInst::NewBox { dst, box_name: box_name.to_string(), args: arg_vars, + type_hint, // Phase 65-2-B: P3-B Box コンストラクタ型ヒント }; let mut insts = arg_insts; diff --git a/src/mir/join_ir/json.rs b/src/mir/join_ir/json.rs index b4042bff..17cde1a9 100644 --- a/src/mir/join_ir/json.rs +++ b/src/mir/join_ir/json.rs @@ -277,6 +277,7 @@ fn write_inst(inst: &JoinInst, out: &mut W) -> std::io::Result<()> { dst, box_name, args, + type_hint, // Phase 65-2-B: 型ヒント追加(JSON には現状出力しない) } => { write!(out, "{{\"type\":\"new_box\"")?; write!(out, ",\"dst\":{}", dst.0)?; @@ -289,6 +290,8 @@ fn write_inst(inst: &JoinInst, out: &mut W) -> std::io::Result<()> { write!(out, "{}", arg.0)?; } write!(out, "]")?; + // Phase 65-2-B: TODO: type_hint を JSON に含めるかは Phase 65-3 で検討 + let _ = type_hint; // unused warning 回避 write!(out, "}}")?; } JoinInst::Compute(mir_like) => { diff --git a/src/mir/join_ir/mod.rs b/src/mir/join_ir/mod.rs index 8ef1554e..0120065b 100644 --- a/src/mir/join_ir/mod.rs +++ b/src/mir/join_ir/mod.rs @@ -359,10 +359,14 @@ pub enum JoinInst { /// Phase 51: Box インスタンス生成 /// new BoxName(args...) の構造を JoinIR で表現 /// MIR 変換時に NewBox 命令に変換 + /// + /// Phase 65-2-B: type_hint で生成される Box 型を伝播(infer_type_from_phi 削減用) NewBox { dst: VarId, box_name: String, args: Vec, + /// Phase 65-2-B: 生成される Box の型ヒント(P3-B Box コンストラクタ対応) + type_hint: Option, }, /// Phase 41-4: 深いネスト if の複数変数 merge(else なし) diff --git a/src/mir/join_ir_vm_bridge/convert.rs b/src/mir/join_ir_vm_bridge/convert.rs index ff4eff5b..aa5ebd1a 100644 --- a/src/mir/join_ir_vm_bridge/convert.rs +++ b/src/mir/join_ir_vm_bridge/convert.rs @@ -323,6 +323,7 @@ pub(crate) fn convert_join_function_to_mir( dst, box_name, args, + type_hint, // Phase 65-2-B: 型ヒント追加(現状は無視、Phase 65-3 で活用) } => { let mir_inst = MirInstruction::NewBox { dst: *dst, @@ -330,6 +331,9 @@ pub(crate) fn convert_join_function_to_mir( args: args.clone(), }; current_instructions.push(mir_inst); + + // Phase 65-2-B: TODO: type_hint を value_types に記録する処理を Phase 65-3 で追加 + let _ = type_hint; // 現状は unused warning 回避 } JoinInst::Call { func,