test: Phase 132 LLVM EXE regression smoke (minimal)
This commit is contained in:
19
apps/tests/phase132_return_loop_var_min.hako
Normal file
19
apps/tests/phase132_return_loop_var_min.hako
Normal 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
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
Reference in New Issue
Block a user