diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 765d5e4e4a..d4684e4dab 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2097,6 +2097,10 @@ fn (mut c Checker) global_decl(mut node ast.GlobalDecl) { c.error('unknown type `$sym.name`', field.typ_pos) } if field.has_expr { + if field.expr is ast.AnonFn && field.name == 'main' { + c.error('the `main` function is the program entry point, cannot redefine it', + field.pos) + } field.typ = c.expr(field.expr) mut v := c.file.global_scope.find_global(field.name) or { panic('internal compiler error - could not find global in scope') diff --git a/vlib/v/checker/tests/globals/redefine_main.out b/vlib/v/checker/tests/globals/redefine_main.out new file mode 100644 index 0000000000..f7a2d410dc --- /dev/null +++ b/vlib/v/checker/tests/globals/redefine_main.out @@ -0,0 +1,3 @@ +vlib/v/checker/tests/globals/redefine_main.vv:1:10: error: the `main` function is the program entry point, cannot redefine it + 1 | __global main = fn () int { return 22 } + | ~~~~ diff --git a/vlib/v/checker/tests/globals/redefine_main.vv b/vlib/v/checker/tests/globals/redefine_main.vv new file mode 100644 index 0000000000..c8786bc304 --- /dev/null +++ b/vlib/v/checker/tests/globals/redefine_main.vv @@ -0,0 +1 @@ +__global main = fn () int { return 22 }