Files
five/compiler
Charles KWON OhJun 3fbb1a48b6 fix(parser): report missing ENDIF/ENDDO/NEXT/ENDCASE/ENDSWITCH
A missing terminator on IF/WHILE/FOR/FOR EACH/DO CASE/SWITCH used to
be silently accepted: parseStmtBlock kept consuming tokens past where
the block should have closed, and the final p.match(token.ENDIF) etc.
returned false without registering an error. The build then "succeeded"
with a near-empty generated .go because every subsequent top-level
FUNCTION had been swallowed into the unterminated block's body and
re-parsed as an expression statement (FUNCTION name(...) reads as two
function calls). At run time vm.Run("MAIN") panicked with "function
not found" — by the time the symptom showed up the cause was three
preprocessing stages away.

Now each branch reports

    expected ENDIF or END to close IF at file:line:col, got ... ""

and the build fails with a useful parse error pointing at the missing
terminator's intended position.

BEGIN SEQUENCE intentionally left alone — END without SEQUENCE is the
documented short form and not an error.

Tested minimum repro (8-line IF without ENDIF) now errors cleanly.
Full regression: go test ./compiler/... ./hbrt/... ./hbrtl/... pass,
compat 56/56, std.ch 17/17, FRB 7/7, FiveSql2 43/43.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 15:57:56 +09:00
..