all: atomic int fixes
							parent
							
								
									82ac39eca6
								
							
						
					
					
						commit
						7dbfa86f25
					
				|  | @ -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