parser: auto-import `sync` when `shared` objects are used (#8294)

pull/8298/head
Uwe Krüger 2021-01-23 16:03:21 +01:00 committed by GitHub
parent bce6a35e8f
commit 74115fe70a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 0 deletions

View File

@ -1034,6 +1034,9 @@ pub fn (mut p Parser) parse_ident(language table.Language) ast.Ident {
// p.warn('name ')
is_shared := p.tok.kind == .key_shared
is_atomic := p.tok.kind == .key_atomic
if is_shared {
p.register_auto_import('sync')
}
mut_pos := p.tok.position()
is_mut := p.tok.kind == .key_mut || is_shared || is_atomic
if is_mut {

View File

@ -0,0 +1,34 @@
const iterations = 100000
fn inc_array_elem(shared b []int, i int) {
for _ in 0 .. iterations {
b[i]++
}
}
fn test_autolock_array() {
shared a := &[1, 2, 7, 5]
t := go inc_array_elem(shared a, 2)
for _ in 0 .. iterations {
a[2]++
}
t.wait()
assert a[2] == 2 * iterations + 7
}
fn inc_map_elem(shared b map[string]int, k string) {
for _ in 0 .. iterations {
b[k]++
}
}
fn test_autolock_map() {
shared m := &{'xy': 1, 'qwe': 2, 'asd': 7, 'iop': 5}
t := go inc_map_elem(shared m, 'asd')
for _ in 0 .. iterations {
m['asd']++
}
t.wait()
assert m['asd'] == 2 * iterations + 7
}