checker: unreachable code warning
							parent
							
								
									2fc05b814c
								
							
						
					
					
						commit
						c500044bae
					
				|  | @ -852,3 +852,79 @@ fn (expr Expr) position() token.Position { | |||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn (stmt Stmt) position() token.Position { | ||||
| 	match mut stmt { | ||||
| 		AssertStmt { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		AssignStmt { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		// Attr {
 | ||||
| 		// }
 | ||||
| 		// Block {
 | ||||
| 		// }
 | ||||
| 		// BranchStmt {
 | ||||
| 		// }
 | ||||
| 		Comment { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		CompIf { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		ConstDecl { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		// DeferStmt {
 | ||||
| 		// }
 | ||||
| 		EnumDecl { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		ExprStmt { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		FnDecl { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		ForCStmt { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		ForInStmt { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		ForStmt { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		// GlobalDecl {
 | ||||
| 		// }
 | ||||
| 		// GoStmt {
 | ||||
| 		// }
 | ||||
| 		// GotoLabel {
 | ||||
| 		// }
 | ||||
| 		// GotoStmt {
 | ||||
| 		// }
 | ||||
| 		// HashStmt {
 | ||||
| 		// }
 | ||||
| 		Import { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		// InterfaceDecl {
 | ||||
| 		// }
 | ||||
| 		// Module {
 | ||||
| 		// }
 | ||||
| 		Return { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		StructDecl { | ||||
| 			return it.pos | ||||
| 		} | ||||
| 		// TypeDecl {
 | ||||
| 		// }
 | ||||
| 		// UnsafeStmt {
 | ||||
| 		// }
 | ||||
| 		else { | ||||
| 			return token.Position{} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -34,6 +34,7 @@ mut: | |||
| 	// checked_ident  string // to avoid infinit checker loops
 | ||||
| 	var_decl_name  string | ||||
| 	returns        bool | ||||
| 	scope_returns  bool | ||||
| 	mod            string // current module name
 | ||||
| 	is_builtin_mod bool // are we in `builtin`?
 | ||||
| } | ||||
|  | @ -1398,6 +1399,7 @@ fn (mut c Checker) stmt(node ast.Stmt) { | |||
| 		ast.Return { | ||||
| 			c.returns = true | ||||
| 			c.return_stmt(mut it) | ||||
| 			c.scope_returns = true | ||||
| 		} | ||||
| 		ast.StructDecl { | ||||
| 			c.struct_decl(it) | ||||
|  | @ -1416,10 +1418,20 @@ fn (mut c Checker) stmt(node ast.Stmt) { | |||
| } | ||||
| 
 | ||||
| fn (mut c Checker) stmts(stmts []ast.Stmt) { | ||||
| 	mut unreachable := token.Position{line_nr: -1} | ||||
| 	c.expected_type = table.void_type | ||||
| 	for stmt in stmts { | ||||
| 		if c.scope_returns { | ||||
| 			if unreachable.line_nr == -1 { | ||||
| 				unreachable = stmt.position() | ||||
| 			} | ||||
| 		} | ||||
| 		c.stmt(stmt) | ||||
| 	} | ||||
| 	if unreachable.line_nr >= 0 { | ||||
| 		c.warn('unreachable code', unreachable) | ||||
| 	} | ||||
| 	c.scope_returns = false | ||||
| 	c.expected_type = table.void_type | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,7 @@ | |||
| vlib/v/checker/tests/unreachable_code.v:3:7: error: unreachable code  | ||||
|     1| fn foo() int { | ||||
|     2|     return if 1 == 1 { 1 } else { 2 } | ||||
|     3|     a := 1 | ||||
|                 ^ | ||||
|     4|     println(a) | ||||
|     5| } | ||||
|  | @ -0,0 +1,8 @@ | |||
| fn foo() int { | ||||
| 	return if 1 == 1 { 1 } else { 2 } | ||||
| 	a := 1 | ||||
| 	println(a) | ||||
| } | ||||
| fn main() { | ||||
| 	foo() | ||||
| } | ||||
		Loading…
	
		Reference in New Issue