test: Phase 132 LLVM EXE regression smoke (minimal)

This commit is contained in:
nyash-codex
2025-12-15 06:24:18 +09:00
parent c8970bd4d4
commit 9d57d2cb9c
2 changed files with 115 additions and 0 deletions

View File

@ -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
}
}

View File

@ -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