Files
five/compiler
CharlesKWON 65b2edc906 fix(gengo): SWITCH edge cases — empty body, OTHERWISE-only, EXIT semantics
Three SWITCH codegen bugs surfaced by harbour-core/tests/switch.prg:

1. Empty SWITCH (`SWITCH x ENDSWITCH`) — legal Harbour, produced by
   conditional-compile files like switch.prg:13. Previous code
   emitted `_sw := t.Pop2()` followed by `}` with no matching `{`,
   closing the enclosing procedure body and producing "syntax error:
   non-declaration statement outside function body".

2. OTHERWISE-only (no CASE arms) — emitted `} else {` with no opening
   if, same "unexpected keyword else" category.

3. `EXIT` inside a CASE should break out of the SWITCH — but Five
   lowers SWITCH to an if/else-if chain, so the generated `break`
   had nowhere to land ("break is not in a loop, switch, or select").

Fix all three by wrapping every SWITCH in a one-iteration `for`
loop. `break` inside a case targets the wrapper, matching Harbour
semantics. Empty / OTHERWISE-only bodies still emit valid Go
because the for-loop provides the scope boundary regardless of
whether any if-chain opened. A trailing `break` keeps the loop
one-shot.

Also:
- `_ = _sw` silences unused-var for empty SWITCH.
- Conditionally emit the if-chain closing `}` only when at least
  one CASE ran.

All 15 SWITCH blocks in harbour-core/tests/switch.prg now build
and run to completion. FiveSql2 43/43, Harbour compat 56/56,
Go test ALL PASS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 17:11:47 +09:00
..