checker: error with `*expr` if not a pointer (#6211)
							parent
							
								
									60eedc2fc3
								
							
						
					
					
						commit
						acc5c95f0d
					
				| 
						 | 
				
			
			@ -2453,8 +2453,14 @@ pub fn (mut c Checker) expr(node ast.Expr) table.Type {
 | 
			
		|||
			if node.op == .amp && !right_type.is_ptr() {
 | 
			
		||||
				return right_type.to_ptr()
 | 
			
		||||
			}
 | 
			
		||||
			if node.op == .mul && right_type.is_ptr() {
 | 
			
		||||
				return right_type.deref()
 | 
			
		||||
			if node.op == .mul {
 | 
			
		||||
				if right_type.is_ptr() {
 | 
			
		||||
					return right_type.deref()
 | 
			
		||||
				}
 | 
			
		||||
				if !right_type.is_pointer() {
 | 
			
		||||
					s := c.table.type_to_str(right_type)
 | 
			
		||||
					c.error('prefix operator `*` not defined for type `$s`', node.pos)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if node.op == .bit_not && !right_type.is_int() && !c.pref.translated {
 | 
			
		||||
				c.error('operator ~ only defined on int types', node.pos)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
vlib/v/checker/tests/prefix_err.v:2:5: error: prefix operator `*` not defined for type `int`
 | 
			
		||||
    1 | a := 1
 | 
			
		||||
    2 | _ = *a
 | 
			
		||||
      |     ^
 | 
			
		||||
    3 | a <- 4
 | 
			
		||||
    4 |
 | 
			
		||||
vlib/v/checker/tests/prefix_err.v:3:1: error: cannot push on non-channel `int`
 | 
			
		||||
    1 | a := 1
 | 
			
		||||
    2 | _ = *a
 | 
			
		||||
    3 | a <- 4
 | 
			
		||||
      | ^
 | 
			
		||||
    4 |
 | 
			
		||||
    5 | _ = ~true
 | 
			
		||||
vlib/v/checker/tests/prefix_err.v:5:5: error: operator ~ only defined on int types
 | 
			
		||||
    3 | a <- 4
 | 
			
		||||
    4 |
 | 
			
		||||
    5 | _ = ~true
 | 
			
		||||
      |     ^
 | 
			
		||||
    6 | _ = !4
 | 
			
		||||
vlib/v/checker/tests/prefix_err.v:6:5: error: ! operator can only be used with bool types
 | 
			
		||||
    4 |
 | 
			
		||||
    5 | _ = ~true
 | 
			
		||||
    6 | _ = !4
 | 
			
		||||
      |     ^
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
a := 1
 | 
			
		||||
_ = *a
 | 
			
		||||
a <- 4
 | 
			
		||||
 | 
			
		||||
_ = ~true
 | 
			
		||||
_ = !4
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ pub fn resolve_addr(addr string, family SocketFamily, typ SocketType) ?Addr {
 | 
			
		|||
 | 
			
		||||
	sport := '$port'
 | 
			
		||||
 | 
			
		||||
	// This might look silly but is reccomended by MSDN
 | 
			
		||||
	// This might look silly but is recommended by MSDN
 | 
			
		||||
	$if windows {
 | 
			
		||||
		socket_error(0-C.getaddrinfo(address.str, sport.str, &hints, &info))?
 | 
			
		||||
	} $else {
 | 
			
		||||
| 
						 | 
				
			
			@ -71,4 +71,4 @@ pub fn resolve_addr(addr string, family SocketFamily, typ SocketType) ?Addr {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	return new_addr(*info.ai_addr, address, port)
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue