From be82b0395efa8d7cfc63e81550873fe0fafe5790 Mon Sep 17 00:00:00 2001 From: JMD <56417208+StunxFS@users.noreply.github.com> Date: Wed, 5 Nov 2025 04:22:47 -0400 Subject: [PATCH] all: make `defer{}` scoped by default, use `defer(fn){}` to get the old behavior (part 3 of #25639) (#25665) --- vlib/v/gen/c/cgen.v | 2 +- vlib/v/gen/c/defer.v | 3 +-- vlib/v/gen/c/fn.v | 2 +- vlib/v/pref/pref.v | 6 ------ vlib/v/tests/defer/defer_fixed_array_test.v | 2 -- vlib/v/tests/defer/defer_if_comptime_test.v | 2 -- vlib/v/tests/defer/defer_return_test.v | 2 -- vlib/v/tests/defer/defer_static_test.v | 2 -- vlib/v/tests/defer/defer_test.v | 2 -- vlib/v/tests/defer/defer_use_returned_value_test.v | 2 -- vlib/v/tests/defer/defer_with_fn_var_test.v | 2 -- vlib/v/tests/defer/scoped_defer_test.v | 2 -- 12 files changed, 3 insertions(+), 26 deletions(-) diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index ac98de936..d8d542505 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2656,7 +2656,7 @@ fn (mut g Gen) stmt(node ast.Stmt) { ast.DeferStmt { mut defer_stmt := node defer_stmt.ifdef = g.defer_ifdef - if defer_stmt.mode == .function || !g.pref.scoped_defer { + if defer_stmt.mode == .function { g.writeln('${g.defer_flag_var(defer_stmt)} = true;') } g.defer_stmts << defer_stmt diff --git a/vlib/v/gen/c/defer.v b/vlib/v/gen/c/defer.v index 255383234..b50c95289 100644 --- a/vlib/v/gen/c/defer.v +++ b/vlib/v/gen/c/defer.v @@ -26,8 +26,7 @@ fn (mut g Gen) write_defer_stmts(scope &ast.Scope, lookup bool, pos token.Pos) { g.error('Gen.write_defer_stmts(): defer_stmt.scope is nil', pos) } - is_scoped := g.pref.scoped_defer && defer_stmt.mode == .scoped - if is_scoped { + if defer_stmt.mode == .scoped { if !((lookup && defer_stmt.scope.start_pos < scope.start_pos && defer_stmt.scope.end_pos > scope.end_pos) || defer_stmt.scope == scope) { diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 3e74c6151..72735e305 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -454,7 +454,7 @@ fn (mut g Gen) gen_fn_decl(node &ast.FnDecl, skip bool) { } g.indent++ for defer_stmt in node.defer_stmts { - if defer_stmt.mode != .function && g.pref.scoped_defer { + if defer_stmt.mode != .function { continue } g.writeln('bool ${g.defer_flag_var(defer_stmt)} = false;') diff --git a/vlib/v/pref/pref.v b/vlib/v/pref/pref.v index dad3729dc..641ab921a 100644 --- a/vlib/v/pref/pref.v +++ b/vlib/v/pref/pref.v @@ -260,8 +260,6 @@ pub mut: subsystem Subsystem // the type of the window app, that is going to be generated; has no effect on !windows is_vls bool json_errors bool // -json-errors, for VLS and other tools - - scoped_defer bool // experimental support, is activated with `-scoped-defer` } pub fn parse_args(known_external_commands []string, args []string) (&Preferences, string) { @@ -764,10 +762,6 @@ pub fn parse_args_and_show_errors(known_external_commands []string, args []strin '-experimental' { res.experimental = true } - '-scoped-defer' { - // experimental, remove once defer is scoped by default - res.scoped_defer = true - } '-usecache' { res.use_cache = true } diff --git a/vlib/v/tests/defer/defer_fixed_array_test.v b/vlib/v/tests/defer/defer_fixed_array_test.v index 758f794ba..acd55f900 100644 --- a/vlib/v/tests/defer/defer_fixed_array_test.v +++ b/vlib/v/tests/defer/defer_fixed_array_test.v @@ -1,5 +1,3 @@ -// vtest vflags: -scoped-defer - fn foo() { a := [u8(1), 2, 3]! defer { diff --git a/vlib/v/tests/defer/defer_if_comptime_test.v b/vlib/v/tests/defer/defer_if_comptime_test.v index b8745c9d1..f745c8734 100644 --- a/vlib/v/tests/defer/defer_if_comptime_test.v +++ b/vlib/v/tests/defer/defer_if_comptime_test.v @@ -1,5 +1,3 @@ -// vtest vflags: -scoped-defer - fn test_main() { defer { $if foo ? { diff --git a/vlib/v/tests/defer/defer_return_test.v b/vlib/v/tests/defer/defer_return_test.v index ddd04bb05..1c0d73492 100644 --- a/vlib/v/tests/defer/defer_return_test.v +++ b/vlib/v/tests/defer/defer_return_test.v @@ -1,5 +1,3 @@ -// vtest vflags: -scoped-defer - @[heap] struct Hwe { mut: diff --git a/vlib/v/tests/defer/defer_static_test.v b/vlib/v/tests/defer/defer_static_test.v index 5c5faf90f..d2cdedb7a 100644 --- a/vlib/v/tests/defer/defer_static_test.v +++ b/vlib/v/tests/defer/defer_static_test.v @@ -1,5 +1,3 @@ -// vtest vflags: -scoped-defer - @[unsafe] fn g() { mut static levels := 0 diff --git a/vlib/v/tests/defer/defer_test.v b/vlib/v/tests/defer/defer_test.v index 6c546319a..a0526bb27 100644 --- a/vlib/v/tests/defer/defer_test.v +++ b/vlib/v/tests/defer/defer_test.v @@ -1,5 +1,3 @@ -// vtest vflags: -scoped-defer - fn foo() string { println('foo()') return 'foo' diff --git a/vlib/v/tests/defer/defer_use_returned_value_test.v b/vlib/v/tests/defer/defer_use_returned_value_test.v index 156963755..ff191c73d 100644 --- a/vlib/v/tests/defer/defer_use_returned_value_test.v +++ b/vlib/v/tests/defer/defer_use_returned_value_test.v @@ -1,5 +1,3 @@ -// vtest vflags: -scoped-defer - struct Test { mut: a int diff --git a/vlib/v/tests/defer/defer_with_fn_var_test.v b/vlib/v/tests/defer/defer_with_fn_var_test.v index 11811d543..8b2d6e8a3 100644 --- a/vlib/v/tests/defer/defer_with_fn_var_test.v +++ b/vlib/v/tests/defer/defer_with_fn_var_test.v @@ -1,5 +1,3 @@ -// vtest vflags: -scoped-defer - @[has_globals] module main diff --git a/vlib/v/tests/defer/scoped_defer_test.v b/vlib/v/tests/defer/scoped_defer_test.v index 1c9e5eaeb..1910c4e4c 100644 --- a/vlib/v/tests/defer/scoped_defer_test.v +++ b/vlib/v/tests/defer/scoped_defer_test.v @@ -1,5 +1,3 @@ -// vtest vflags: -scoped-defer - struct Data { mut: counter int -- 2.39.5