all: atomic int fixes
parent
2d9fa62941
commit
b7f2ef78b2
|
@ -578,3 +578,8 @@ pub fn (b u8) repeat(count int) string {
|
|||
}
|
||||
return unsafe { ret.vstring_with_len(new_len) }
|
||||
}
|
||||
|
||||
// for atomic ints, internal
|
||||
fn _Atomic__int_str(x int) string {
|
||||
return x.str()
|
||||
}
|
||||
|
|
|
@ -127,7 +127,7 @@ pub fn (t Type) atomic_typename() string {
|
|||
idx := t.idx()
|
||||
match idx {
|
||||
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.i64_type_idx { return 'atomic_llong' }
|
||||
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--
|
||||
res = 'shared ' + res
|
||||
}
|
||||
if typ.has_flag(.atomic_f) {
|
||||
nr_muls--
|
||||
res = 'atomic ' + res
|
||||
}
|
||||
if nr_muls > 0 && !typ.has_flag(.variadic) {
|
||||
res = strings.repeat(`&`, nr_muls) + res
|
||||
}
|
||||
|
|
|
@ -35,7 +35,8 @@ fn (mut c Checker) for_in_stmt(mut node ast.ForInStmt) {
|
|||
if node.is_range {
|
||||
high_type := c.expr(node.high)
|
||||
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())
|
||||
} 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())
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
if p.tok.kind == .key_mut || is_shared || is_atomic {
|
||||
if p.tok.kind == .key_mut || is_shared { // || is_atomic {
|
||||
nr_muls++
|
||||
p.next()
|
||||
}
|
||||
if is_atomic {
|
||||
p.next()
|
||||
}
|
||||
if p.tok.kind == .mul {
|
||||
p.error('use `&Type` instead of `*Type` when declaring references')
|
||||
return 0
|
||||
|
|
|
@ -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++
|
||||
}
|
Loading…
Reference in New Issue