parser,checker: allow a goto label right after return
parent
8cd01e0eac
commit
1b6cccaf6d
|
@ -5162,6 +5162,12 @@ fn (mut c Checker) stmts(stmts []ast.Stmt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.stmt(stmt)
|
c.stmt(stmt)
|
||||||
|
if stmt is ast.GotoLabel {
|
||||||
|
unreachable = token.Position{
|
||||||
|
line_nr: -1
|
||||||
|
}
|
||||||
|
c.scope_returns = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if unreachable.line_nr >= 0 {
|
if unreachable.line_nr >= 0 {
|
||||||
c.error('unreachable code', unreachable)
|
c.error('unreachable code', unreachable)
|
||||||
|
|
|
@ -2974,7 +2974,7 @@ fn (mut p Parser) return_stmt() ast.Return {
|
||||||
p.next()
|
p.next()
|
||||||
// no return
|
// no return
|
||||||
mut comments := p.eat_comments()
|
mut comments := p.eat_comments()
|
||||||
if p.tok.kind == .rcbr {
|
if p.tok.kind == .rcbr || ( p.tok.kind == .name && p.peek_tok.kind == .colon ) {
|
||||||
return ast.Return{
|
return ast.Return{
|
||||||
comments: comments
|
comments: comments
|
||||||
pos: first_pos
|
pos: first_pos
|
||||||
|
|
|
@ -11,3 +11,28 @@ fn test_goto() {
|
||||||
}
|
}
|
||||||
assert i == 3
|
assert i == 3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn test_goto_after_return() {
|
||||||
|
a, b, c, d := 4, 5, 6, 7
|
||||||
|
for {
|
||||||
|
for {
|
||||||
|
for {
|
||||||
|
if a == 4 {
|
||||||
|
if b == 5 {
|
||||||
|
if c == 6 {
|
||||||
|
if d == 7 {
|
||||||
|
unsafe {
|
||||||
|
goto finally_ok
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert false
|
||||||
|
return
|
||||||
|
finally_ok:
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue