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