fix: diagnose missing 'main' instead of segfaulting on 'sx run' (issue 0137)

A program with no 'main' reached the JIT entry-point call with a garbage
address (ORC reports lookup success but leaves main_addr degenerate), then
called it -> SIGSEGV. Add a pre-JIT entry-point check in main.zig that emits
'error: no main function found' and exits non-zero before codegen, plus a
defensive main_addr==0 guard in target.zig runJITFromObject as a backstop.

Regression: examples/1188-diagnostics-run-no-main.sx
This commit is contained in:
agra
2026-06-21 09:10:30 +03:00
parent 11dc6a3299
commit 6ed29621ad
8 changed files with 72 additions and 0 deletions

View File

@@ -1,39 +0,0 @@
// issue 0134 — a same-name `error` set collapses into a namespaced import's
// set (error sets lack per-decl nominal identity).
//
// `EventErr` is declared locally as `error { Boom }`, but
// `#import "modules/std.sx"` also carries `event.EventErr` (an error set with
// tags Init/Register/Wait). Because error-set DECLARATIONS are not given
// per-decl nominal identity (unlike struct/enum/union under E6a) —
// `registerErrorSetDecl` registers via the flat `findByName`-dedup path — the
// local `EventErr` collapses into the imported one, losing its own `Boom` tag.
//
// So `raise error.Boom` / `r == error.Boom` are checked against the IMPORTED
// set, which has no `Boom`.
//
// EXPECT (today): build FAILS —
// error: error tag 'error.Boom' is not in error set 'EventErr'
// EXPECT (after fix): prints `own EventErr.Boom`, exit 0.
//
// Proof it's the collision: rename `EventErr` -> `MyErr` and it compiles and
// prints. The reference side (`!EventErr` → resolveNominalLeaf) is already
// visibility-aware from issue 0132's broader fix, but it is dormant until the
// local declaration gets its own TypeId. See the .md.
#import "modules/std.sx";
EventErr :: error { Boom }
fail :: () -> !EventErr {
raise error.Boom;
}
main :: () -> i32 {
r := fail();
if r == error.Boom {
print("own EventErr.Boom\n");
return 0;
}
print("wrong set\n");
return 1;
}

View File

@@ -1,5 +1,12 @@
# 0137 — `sx run` on a program with no `main` segfaults (JIT entry lookup unguarded)
> **RESOLVED.** A pre-JIT entry-point check in `main.zig` now emits a clean
> `error: no 'main' function found …` diagnostic and exits non-zero before any
> codegen/JIT, so a no-main program never reaches the garbage-pointer call. A
> defensive `main_addr == 0` guard in `target.zig`'s `runJITFromObject` (ORC
> reports lookup success but leaves the address degenerate) remains as a
> backstop. Regression test: `examples/1188-diagnostics-run-no-main.sx`.
## Symptom
`sx run <file>` on a program that defines no `main` function **crashes**