aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Sema.zig4
-rw-r--r--test/cases/compile_errors/missing_main_fn_in_executable.zig9
-rw-r--r--test/cases/compile_errors/private_main_fn.zig10
-rw-r--r--test/cases/compile_errors/stage1/exe/missing_main_fn_in_executable.zig8
-rw-r--r--test/cases/compile_errors/stage1/exe/private_main_fn.zig9
5 files changed, 23 insertions, 17 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 74e40687f1..6fcff1fec8 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -2257,6 +2257,9 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {
sema.owner_decl.analysis = .sema_failure;
sema.owner_decl.generation = mod.generation;
}
+ if (sema.func) |func| {
+ func.state = .sema_failure;
+ }
const gop = mod.failed_decls.getOrPutAssumeCapacity(sema.owner_decl_index);
if (gop.found_existing) {
// If there are multiple errors for the same Decl, prefer the first one added.
@@ -6385,6 +6388,7 @@ fn analyzeCall(
}),
else => unreachable,
};
+ if (!is_comptime_call and module_fn.state == .sema_failure) return error.AnalysisFail;
// Analyze the ZIR. The same ZIR gets analyzed into a runtime function
// or an inlined call depending on what union tag the `label` field is
diff --git a/test/cases/compile_errors/missing_main_fn_in_executable.zig b/test/cases/compile_errors/missing_main_fn_in_executable.zig
new file mode 100644
index 0000000000..2d608ad2b8
--- /dev/null
+++ b/test/cases/compile_errors/missing_main_fn_in_executable.zig
@@ -0,0 +1,9 @@
+
+
+// error
+// backend=llvm
+// target=x86_64-linux
+// output_mode=Exe
+//
+// :?:?: error: root struct of file 'tmp' has no member named 'main'
+// :?:?: note: called from here
diff --git a/test/cases/compile_errors/private_main_fn.zig b/test/cases/compile_errors/private_main_fn.zig
new file mode 100644
index 0000000000..26ad3d22db
--- /dev/null
+++ b/test/cases/compile_errors/private_main_fn.zig
@@ -0,0 +1,10 @@
+fn main() void {}
+
+// error
+// backend=llvm
+// target=x86_64-linux
+// output_mode=Exe
+//
+// :?:?: error: 'main' is not marked 'pub'
+// :1:1: note: declared here
+// :?:?: note: called from here
diff --git a/test/cases/compile_errors/stage1/exe/missing_main_fn_in_executable.zig b/test/cases/compile_errors/stage1/exe/missing_main_fn_in_executable.zig
deleted file mode 100644
index 65813abac3..0000000000
--- a/test/cases/compile_errors/stage1/exe/missing_main_fn_in_executable.zig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-// error
-// backend=stage1
-// target=native
-// output_mode=Exe
-//
-// error: root source file has no member called 'main'
diff --git a/test/cases/compile_errors/stage1/exe/private_main_fn.zig b/test/cases/compile_errors/stage1/exe/private_main_fn.zig
deleted file mode 100644
index 5a178389e8..0000000000
--- a/test/cases/compile_errors/stage1/exe/private_main_fn.zig
+++ /dev/null
@@ -1,9 +0,0 @@
-fn main() void {}
-
-// error
-// backend=stage1
-// target=native
-// output_mode=Exe
-//
-// error: 'main' is private
-// tmp.zig:1:1: note: declared here