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
|
// checked_ident string // to avoid infinit checker loops
|
||||||
var_decl_name string
|
var_decl_name string
|
||||||
returns bool
|
returns bool
|
||||||
|
scope_returns bool
|
||||||
mod string // current module name
|
mod string // current module name
|
||||||
is_builtin_mod bool // are we in `builtin`?
|
is_builtin_mod bool // are we in `builtin`?
|
||||||
}
|
}
|
||||||
|
@ -1398,6 +1399,7 @@ fn (mut c Checker) stmt(node ast.Stmt) {
|
||||||
ast.Return {
|
ast.Return {
|
||||||
c.returns = true
|
c.returns = true
|
||||||
c.return_stmt(mut it)
|
c.return_stmt(mut it)
|
||||||
|
c.scope_returns = true
|
||||||
}
|
}
|
||||||
ast.StructDecl {
|
ast.StructDecl {
|
||||||
c.struct_decl(it)
|
c.struct_decl(it)
|
||||||
|
@ -1416,10 +1418,20 @@ fn (mut c Checker) stmt(node ast.Stmt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut c Checker) stmts(stmts []ast.Stmt) {
|
fn (mut c Checker) stmts(stmts []ast.Stmt) {
|
||||||
|
mut unreachable := token.Position{line_nr: -1}
|
||||||
c.expected_type = table.void_type
|
c.expected_type = table.void_type
|
||||||
for stmt in stmts {
|
for stmt in stmts {
|
||||||
|
if c.scope_returns {
|
||||||
|
if unreachable.line_nr == -1 {
|
||||||
|
unreachable = stmt.position()
|
||||||
|
}
|
||||||
|
}
|
||||||
c.stmt(stmt)
|
c.stmt(stmt)
|
||||||
}
|
}
|
||||||
|
if unreachable.line_nr >= 0 {
|
||||||
|
c.warn('unreachable code', unreachable)
|
||||||
|
}
|
||||||
|
c.scope_returns = false
|
||||||
c.expected_type = table.void_type
|
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