v.checker: fix `unused variable` warning on `*p = val`
							parent
							
								
									8361f714dd
								
							
						
					
					
						commit
						cf3dd7a51f
					
				| 
						 | 
				
			
			@ -121,21 +121,21 @@ pub fn (mut c Checker) check(ast_file &ast.File) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
pub fn (mut c Checker) check_scope_vars(sc &ast.Scope) {
 | 
			
		||||
	for _, obj in sc.objects {
 | 
			
		||||
		match obj {
 | 
			
		||||
			ast.Var {
 | 
			
		||||
				if !c.pref.is_repl {
 | 
			
		||||
					if !obj.is_used && obj.name[0] != `_` && !c.file.is_test {
 | 
			
		||||
	if !c.pref.is_repl && !c.file.is_test {
 | 
			
		||||
		for _, obj in sc.objects {
 | 
			
		||||
			match obj {
 | 
			
		||||
				ast.Var {
 | 
			
		||||
					if !obj.is_used && obj.name[0] != `_` {
 | 
			
		||||
						c.warn('unused variable: `$obj.name`', obj.pos)
 | 
			
		||||
					}
 | 
			
		||||
					if obj.is_mut && !obj.is_changed && !c.is_builtin_mod && obj.name != 'it' {
 | 
			
		||||
						// if obj.is_mut && !obj.is_changed && !c.is_builtin {  //TODO C error bad field not checked
 | 
			
		||||
						// c.warn('`$obj.name` is declared as mutable, but it was never changed',
 | 
			
		||||
						// obj.pos)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if obj.is_mut && !obj.is_changed && !c.is_builtin_mod && obj.name != 'it' {
 | 
			
		||||
					// if obj.is_mut && !obj.is_changed && !c.is_builtin {  //TODO C error bad field not checked
 | 
			
		||||
					// c.warn('`$obj.name` is declared as mutable, but it was never changed',
 | 
			
		||||
					// obj.pos)
 | 
			
		||||
				}
 | 
			
		||||
				else {}
 | 
			
		||||
			}
 | 
			
		||||
			else {}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for child in sc.children {
 | 
			
		||||
| 
						 | 
				
			
			@ -3323,9 +3323,24 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) {
 | 
			
		|||
			}
 | 
			
		||||
			ast.PrefixExpr {
 | 
			
		||||
				// Do now allow `*x = y` outside `unsafe`
 | 
			
		||||
				if left.op == .mul && !c.inside_unsafe {
 | 
			
		||||
					c.error('modifying variables via dereferencing can only be done in `unsafe` blocks',
 | 
			
		||||
						assign_stmt.pos)
 | 
			
		||||
				if left.op == .mul {
 | 
			
		||||
					if !c.inside_unsafe {
 | 
			
		||||
						c.error('modifying variables via dereferencing can only be done in `unsafe` blocks',
 | 
			
		||||
							assign_stmt.pos)
 | 
			
		||||
					} else {
 | 
			
		||||
						// mark `p` in `*p = val` as used:
 | 
			
		||||
						match mut left.right {
 | 
			
		||||
							ast.Ident {
 | 
			
		||||
								match mut left.right.obj {
 | 
			
		||||
									ast.Var {
 | 
			
		||||
										left.right.obj.is_used = true
 | 
			
		||||
									}
 | 
			
		||||
									else {}
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
							else {}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if is_decl {
 | 
			
		||||
					c.error('non-name on the left side of `:=`', left.pos)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,3 +72,32 @@ fn test_unsafe_if_stmt() {
 | 
			
		|||
	x := unsafe_if_stmt()
 | 
			
		||||
	assert x == 4
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const fixedbytes = [100]byte{}
 | 
			
		||||
 | 
			
		||||
fn test_unsafe_pointers() {
 | 
			
		||||
	fsize := fixedbytes.len
 | 
			
		||||
	src := &fixedbytes[0]
 | 
			
		||||
	//
 | 
			
		||||
	b := []byte{}
 | 
			
		||||
	eprintln('b.data before: $b.data')
 | 
			
		||||
	eprintln('b.len before: $b.len')
 | 
			
		||||
	eprintln('b.cap before: $b.cap')
 | 
			
		||||
	assert b.len == 0
 | 
			
		||||
	unsafe {
 | 
			
		||||
		// here b will be setup to work with the mmaped region
 | 
			
		||||
		mut pdata := &b.data
 | 
			
		||||
		mut plen := &b.len
 | 
			
		||||
		mut pcap := &b.cap
 | 
			
		||||
		// note that pdata, plen, pcap are used here:
 | 
			
		||||
		*pdata = src
 | 
			
		||||
		*plen = int(fsize)
 | 
			
		||||
		*pcap = int(fsize)
 | 
			
		||||
	}
 | 
			
		||||
	assert b.len == 100
 | 
			
		||||
	assert b.cap == 100
 | 
			
		||||
	assert b.data == src
 | 
			
		||||
	eprintln('b.data after: $b.data')
 | 
			
		||||
	eprintln('b.len after: $b.len')
 | 
			
		||||
	eprintln('b.cap after: $b.cap')
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue