feat(joinir): Phase 227 - CarrierRole separation (LoopState vs ConditionOnly)

- Add CarrierRole enum to distinguish state carriers from condition-only carriers
- ConditionOnly carriers (is_digit_pos) skip exit PHI but keep header PHI
- Update all test struct literals with role field
- 877/884 tests PASS (7 pre-existing failures unrelated)

Remaining: ValueId(0) undefined - header PHI initialization for ConditionOnly

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-10 20:07:30 +09:00
parent d28e54ba06
commit 478cc0012e
20 changed files with 163 additions and 6 deletions

View File

@ -183,11 +183,12 @@ impl DigitPosPromoter {
// For DigitPos pattern, we add a NEW carrier (not replace loop_var)
let carrier_name = format!("is_{}", var_in_cond);
use crate::mir::join_ir::lowering::carrier_info::CarrierVar;
use crate::mir::join_ir::lowering::carrier_info::{CarrierVar, CarrierRole};
let promoted_carrier = CarrierVar {
name: carrier_name.clone(),
host_id: ValueId(0), // Placeholder (will be remapped)
join_id: None, // Will be allocated later
role: CarrierRole::ConditionOnly, // Phase 227: DigitPos is condition-only
};
// Create CarrierInfo with a dummy loop_var_name (will be ignored during merge)