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) }
|
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()
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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