diff --git a/apps/tests/phase132_return_loop_var_min.hako b/apps/tests/phase132_return_loop_var_min.hako new file mode 100644 index 00000000..332030ea --- /dev/null +++ b/apps/tests/phase132_return_loop_var_min.hako @@ -0,0 +1,19 @@ +// Phase 132: Minimal test for loop variable return value +// +// Tests that exit PHI correctly returns the final loop variable value +// (not the initial value or module-level garbage). +// +// Expected output: RC:3 +// - loop runs 3 iterations (i=0,1,2) +// - returns final i value (3) + +static box Main { + main() { + local i + i = 0 + loop(i < 3) { + i = i + 1 + } + return i + } +} diff --git a/tools/smokes/v2/profiles/integration/apps/phase132_exit_phi_parity.sh b/tools/smokes/v2/profiles/integration/apps/phase132_exit_phi_parity.sh new file mode 100644 index 00000000..b855b1b6 --- /dev/null +++ b/tools/smokes/v2/profiles/integration/apps/phase132_exit_phi_parity.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# Phase 132: Exit PHI value parity smoke test +# Tests: Loop variable return via exit PHI (VM/LLVM parity) + +source "$(dirname "$0")/../../../lib/test_runner.sh" +export SMOKES_USE_PYVM=0 +require_env || exit 2 + +# Check LLVM availability (SKIP if not found) +if ! command -v llvm-config-18 &> /dev/null; then + test_skip "llvm-config-18 not found"; exit 0 +fi + +# Check hakorune LLVM backend availability +if ! "$NYASH_BIN" --help 2>&1 | grep -q "llvm"; then + test_skip "hakorune --backend llvm not available"; exit 0 +fi + +# Check Python llvmlite +if ! python3 -c "import llvmlite" 2>/dev/null; then + test_skip "Python llvmlite not found"; exit 0 +fi + +# Create tmp directory +mkdir -p "$NYASH_ROOT/tmp" + +PASS_COUNT=0 +FAIL_COUNT=0 + +# ===== Case A: Simple loop return ===== +echo "[INFO] Case A: phase132_return_loop_var_min.hako" + +INPUT_A="$NYASH_ROOT/apps/tests/phase132_return_loop_var_min.hako" +OUTPUT_A="$NYASH_ROOT/tmp/phase132_return_loop_var_min" + +if "$NYASH_ROOT/tools/build_llvm.sh" "$INPUT_A" -o "$OUTPUT_A" > /tmp/phase132_a_build.log 2>&1; then + if [ -x "$OUTPUT_A" ]; then + set +e + "$OUTPUT_A" > /dev/null 2>&1 + EXIT_CODE=$? + set -e + + if [ "$EXIT_CODE" -eq 3 ]; then + echo "[PASS] Case A: exit code 3 verified" + ((PASS_COUNT++)) + else + echo "[FAIL] Case A: Expected exit code 3, got $EXIT_CODE" + ((FAIL_COUNT++)) + fi + else + echo "[FAIL] Case A: Executable not created" + ((FAIL_COUNT++)) + fi +else + echo "[FAIL] Case A: build_llvm.sh failed" + ((FAIL_COUNT++)) +fi + +# ===== Case B: Complex loop with early exit ===== +echo "[INFO] Case B: llvm_stage3_loop_only.hako" + +INPUT_B="$NYASH_ROOT/apps/tests/llvm_stage3_loop_only.hako" +OUTPUT_B="$NYASH_ROOT/tmp/llvm_stage3_loop_only" + +if "$NYASH_ROOT/tools/build_llvm.sh" "$INPUT_B" -o "$OUTPUT_B" > /tmp/phase132_b_build.log 2>&1; then + if [ -x "$OUTPUT_B" ]; then + set +e + OUTPUT=$("$OUTPUT_B" 2>&1) + set -e + + if echo "$OUTPUT" | grep -q "Result: 3"; then + echo "[PASS] Case B: stdout contains 'Result: 3'" + ((PASS_COUNT++)) + else + echo "[FAIL] Case B: Expected stdout to contain 'Result: 3'" + ((FAIL_COUNT++)) + fi + else + echo "[FAIL] Case B: Executable not created" + ((FAIL_COUNT++)) + fi +else + echo "[FAIL] Case B: build_llvm.sh failed" + ((FAIL_COUNT++)) +fi + +# ===== Summary ===== +echo "[INFO] PASS: $PASS_COUNT, FAIL: $FAIL_COUNT" + +if [ "$FAIL_COUNT" -eq 0 ]; then + test_pass "phase132_exit_phi_parity: All tests passed" + exit 0 +else + test_fail "phase132_exit_phi_parity: $FAIL_COUNT test(s) failed" + exit 1 +fi