## Summary Implemented fail-fast validation for PHI ordering and value resolution in strict mode. ## Changes ### P1-1: Strict mode for "PHI after terminator" - File: `src/llvm_py/phi_wiring/wiring.py::ensure_phi` - Behavior: `NYASH_LLVM_PHI_STRICT=1` → RuntimeError if PHI created after terminator - Default: Warning only (no regression) ### P1-2: Strict mode for "fallback 0" - File: `src/llvm_py/phi_wiring/wiring.py::wire_incomings` - Behavior: Strict mode forbids silent fallback to 0 (2 locations) - Location 1: Unresolvable incoming value - Location 2: Type coercion failure - Error messages point to next debug file: `llvm_builder.py::_value_at_end_i64` ### P1-3: Connect verify_phi_ordering() to execution path - File: `src/llvm_py/builders/function_lower.py` - Behavior: Verify PHI ordering after all instructions emitted - Debug mode: Shows "✅ All N blocks have correct PHI ordering" - Strict mode: Raises RuntimeError with block list if violations found ## Testing ✅ Test 1: strict=OFF - passes without errors ✅ Test 2: strict=ON - passes without errors (no violations in test fixtures) ✅ Test 3: debug mode - verify_phi_ordering() connected and running ## Scope - LLVM harness (Python) changes only - No new environment variables (uses existing 3 from Phase 277 P2) - No JoinIR/Rust changes (root fix is Phase 279) - Default behavior unchanged (strict mode opt-in) ## Next Steps - Phase 278: Remove deprecated env var support - Phase 279: Root fix - unify "2本のコンパイラ" pipelines 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1.8 KiB
1.8 KiB
Phase 275: Coercion Implementation (truthiness / == / +)
Status: ✅ completed (Phase 275 P0)
Goal: implement the accepted coercion SSOT across backends (Rust VM + LLVM harness) and update language docs and fixtures so behavior cannot drift.
Accepted SSOT decisions:
docs/development/current/main/phases/phase-274/P3-DECISIONS.md
Language SSOT (updated after Phase 275):
docs/reference/language/types.md
What changes in this phase
Implement these semantics (A1/B2/C2):
- truthiness (boolean context)
Voidin condition → TypeErrorBoxRefin condition → TypeError, except explicit bridge boxes (BoolBox/IntegerBox/StringBox)- “object is always truthy” remains prohibited
- equality (
==)
- allow Int↔Float numeric comparison only (precise rule; no accidental true via float rounding)
- Bool is not a number: no Bool↔Int coercion
- other mixed kinds: deterministic
false(not error) - BoxRef equality: identity only
+
- numeric add: Int+Int, Float+Float, Int↔Float promotion to Float
- string concat: String+String only
- String mixed (
"a"+1,1+"a") → TypeError (no implicit stringify)
Acceptance criteria (minimum)
- Rust VM behavior matches
P3-DECISIONS.mdfor truthiness /==/+. - LLVM harness behavior matches Rust VM (no backend divergence).
docs/reference/language/types.mdis updated to reflect the new executable SSOT.- New fixtures + smokes lock behavior (VM + LLVM) without introducing environment-variable sprawl.
- No by-name hardcoding for “special cases”; if something must be special, it must be a documented bridge rule.
Implementation guide
docs/development/current/main/phases/phase-275/P0-INSTRUCTIONS.mddocs/development/current/main/phases/phase-275/P1-INSTRUCTIONS.md