all: atomic int fixes

master
Alexander Medvednikov 2022-04-27 18:31:21 +03:00
parent 82ac39eca6
commit 7dbfa86f25
5 changed files with 39 additions and 3 deletions

View File

@ -578,3 +578,8 @@ pub fn (b u8) repeat(count int) string {
} }
return unsafe { ret.vstring_with_len(new_len) } return unsafe { ret.vstring_with_len(new_len) }
} }
// for atomic ints, internal
fn _Atomic__int_str(x int) string {
return x.str()
}

View File

@ -127,7 +127,7 @@ pub fn (t Type) atomic_typename() string {
idx := t.idx() idx := t.idx()
match idx { match idx {
ast.u32_type_idx { return 'atomic_uint' } ast.u32_type_idx { return 'atomic_uint' }
ast.int_type_idx { return 'atomic_int' } ast.int_type_idx { return '_Atomic int' }
ast.u64_type_idx { return 'atomic_ullong' } ast.u64_type_idx { return 'atomic_ullong' }
ast.i64_type_idx { return 'atomic_llong' } ast.i64_type_idx { return 'atomic_llong' }
else { return 'unknown_atomic' } else { return 'unknown_atomic' }
@ -1161,6 +1161,10 @@ pub fn (t &Table) type_to_str_using_aliases(typ Type, import_aliases map[string]
nr_muls-- nr_muls--
res = 'shared ' + res res = 'shared ' + res
} }
if typ.has_flag(.atomic_f) {
nr_muls--
res = 'atomic ' + res
}
if nr_muls > 0 && !typ.has_flag(.variadic) { if nr_muls > 0 && !typ.has_flag(.variadic) {
res = strings.repeat(`&`, nr_muls) + res res = strings.repeat(`&`, nr_muls) + res
} }

View File

@ -35,7 +35,8 @@ fn (mut c Checker) for_in_stmt(mut node ast.ForInStmt) {
if node.is_range { if node.is_range {
high_type := c.expr(node.high) high_type := c.expr(node.high)
high_type_idx := high_type.idx() high_type_idx := high_type.idx()
if typ_idx in ast.integer_type_idxs && high_type_idx !in ast.integer_type_idxs { if typ_idx in ast.integer_type_idxs && high_type_idx !in ast.integer_type_idxs
&& high_type_idx != ast.void_type_idx {
c.error('range types do not match', node.cond.pos()) c.error('range types do not match', node.cond.pos())
} else if typ_idx in ast.float_type_idxs || high_type_idx in ast.float_type_idxs { } else if typ_idx in ast.float_type_idxs || high_type_idx in ast.float_type_idxs {
c.error('range type can not be float', node.cond.pos()) c.error('range type can not be float', node.cond.pos())

View File

@ -401,10 +401,13 @@ pub fn (mut p Parser) parse_type() ast.Type {
p.error_with_pos('cannot use `mut` on struct field type', p.tok.pos()) p.error_with_pos('cannot use `mut` on struct field type', p.tok.pos())
} }
} }
if p.tok.kind == .key_mut || is_shared || is_atomic { if p.tok.kind == .key_mut || is_shared { // || is_atomic {
nr_muls++ nr_muls++
p.next() p.next()
} }
if is_atomic {
p.next()
}
if p.tok.kind == .mul { if p.tok.kind == .mul {
p.error('use `&Type` instead of `*Type` when declaring references') p.error('use `&Type` instead of `*Type` when declaring references')
return 0 return 0

View File

@ -0,0 +1,23 @@
import term
import os
import runtime
import time
struct App {
mut:
idx atomic int
}
fn test_atomic() {
mut app := &App{}
for i in 0 .. 10 {
go app.run()
}
time.sleep(2 * time.second)
println('idx=$app.idx')
assert app.idx == 10
}
fn (mut app App) run() {
app.idx++
}