Files
hakorune/docs/development/current/main/phases/phase-275/README.md

51 lines
1.8 KiB
Markdown
Raw Normal View History

feat(llvm/phi): Phase 277 P1 - fail-fast validation for PHI strict mode ## 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>
2025-12-22 14:48:37 +09:00
# 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):
1) truthiness (boolean context)
- `Void` in condition → **TypeError**
- `BoxRef` in condition → **TypeError**, except explicit bridge boxes (BoolBox/IntegerBox/StringBox)
- “object is always truthy” remains prohibited
2) 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
3) `+`
- 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.md` for truthiness / `==` / `+`.
- LLVM harness behavior matches Rust VM (no backend divergence).
- `docs/reference/language/types.md` is 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.md`
- `docs/development/current/main/phases/phase-275/P1-INSTRUCTIONS.md`