diff --git a/lang/el-compiler/src/compiler.el b/lang/el-compiler/src/compiler.el index b9647bb..14c3ccd 100644 --- a/lang/el-compiler/src/compiler.el +++ b/lang/el-compiler/src/compiler.el @@ -419,6 +419,22 @@ fn resolve_imports(src_path: String) -> String { if !str_eq(already, "") { return "" } state_set(seen_key, "1") + // A missing file must be a hard error, never an empty string. + // + // fs_read returns "" both for "file is empty" and "file does not exist", and + // this function used the value without distinguishing them. So a broken + // import path — a typo, a moved file, a relative path resolved from the + // wrong working directory — compiled CLEANLY: exit 0, empty stderr, and a + // program silently missing everything it imported. Observed 2026-08-15: + // eleven consecutive "successful" compiles that had included no runtime at + // all, and a wrong conclusion drawn from them before anyone noticed. + // + // Missing dependency, confident success. fs_exists separates the two cases, + // so a genuinely empty file still resolves to "" and is fine. + if !fs_exists(src_path) { + println("elc: cannot resolve import: " + src_path) + exit_program(1) + } let source: String = fs_read(src_path) let dir: String = dirname_of(src_path) let lines: [String] = str_split(source, "\n")