Skip to content

Commit b909e2e

Browse files
authored
parser, cgen: fix static and volatile var deref (fix #24778) (fix #24779) (#24807)
1 parent bea73f7 commit b909e2e

File tree

6 files changed

+55
-2
lines changed

6 files changed

+55
-2
lines changed

cmd/tools/vast/vast.v

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,8 @@ fn (t Tree) var(node ast.Var) &Node {
956956
obj.add_terse('expr', t.expr(node.expr))
957957
obj.add_terse('is_arg', t.bool_node(node.is_arg))
958958
obj.add_terse('is_mut', t.bool_node(node.is_mut))
959+
obj.add_terse('is_static', t.bool_node(node.is_static))
960+
obj.add_terse('is_volatile', t.bool_node(node.is_volatile))
959961
obj.add('is_used', t.bool_node(node.is_used))
960962
obj.add('is_changed', t.bool_node(node.is_changed))
961963
obj.add_terse('ct_type_var', t.enum_node(node.ct_type_var))

vlib/v/ast/ast.v

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,8 @@ pub:
904904
name string
905905
share ShareType
906906
is_mut bool
907+
is_static bool
908+
is_volatile bool
907909
is_autofree_tmp bool
908910
is_inherited bool
909911
has_inherited bool

vlib/v/gen/c/assign.v

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,15 @@ fn (mut g Gen) expr_with_opt(expr ast.Expr, expr_typ ast.Type, ret_typ ast.Type)
179179
fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
180180
mut node := unsafe { node_ }
181181
if node.is_static {
182-
g.write('static ')
182+
is_defer_var := node.left[0] is ast.Ident && node.left[0].name in g.defer_vars
183+
if is_defer_var && node.op == .decl_assign {
184+
return
185+
}
186+
if !is_defer_var {
187+
g.write('static ')
188+
}
183189
}
184-
if node.is_volatile {
190+
if node.is_volatile && node.left[0] is ast.Ident && node.left[0].name !in g.defer_vars {
185191
g.write('volatile ')
186192
}
187193
mut return_type := ast.void_type

vlib/v/gen/c/fn.v

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,12 @@ fn (mut g Gen) gen_fn_decl(node &ast.FnDecl, skip bool) {
444444
}
445445
info := var.obj as ast.Var
446446
if g.table.sym(info.typ).kind != .function {
447+
if info.is_static {
448+
g.write('static ')
449+
}
450+
if info.is_volatile {
451+
g.write('volatile ')
452+
}
447453
g.writeln('${g.styp(info.typ)}${deref} ${c_name(var.name)};')
448454
}
449455
}

vlib/v/parser/assign.v

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr) ast.Stmt {
224224
expr: if left.len == right.len { right[i] } else { ast.empty_expr }
225225
share: share
226226
is_mut: lx.is_mut || p.inside_for
227+
is_static: is_static
228+
is_volatile: is_volatile
227229
pos: lx.pos
228230
is_stack_obj: p.inside_for
229231
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
@[unsafe]
2+
fn g() {
3+
mut static levels := 0
4+
levels++
5+
defer { levels-- }
6+
}
7+
8+
fn f(depth int) {
9+
if depth == 0 {
10+
return
11+
}
12+
unsafe {
13+
mut static levels := 0
14+
levels++
15+
defer { levels-- }
16+
if depth == 3 {
17+
assert levels == 1
18+
}
19+
if depth == 2 {
20+
assert levels == 2
21+
}
22+
if depth == 1 {
23+
assert levels == 3
24+
}
25+
println('levels: ${levels} | depth: ${depth}')
26+
}
27+
f(depth - 1)
28+
}
29+
30+
fn test_main() {
31+
f(3)
32+
f(3)
33+
34+
unsafe { g() }
35+
}

0 commit comments

Comments
 (0)