From: Robert Griesemer Date: Fri, 18 May 2018 03:56:11 +0000 (-0400) Subject: go/parser: make sure we have a valid AST when 'if' condition is missing X-Git-Tag: go1.11beta1~396 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=db37e1600fb2fc698b14e745005c4cf44251d2a9;p=gostls13.git go/parser: make sure we have a valid AST when 'if' condition is missing This prevents a crash in go/types due to a nil condition in an 'if' statement. There's more we can do to make go/types more robust but this will address the immediate cause and also makes sure that the parser returns a valid AST in this case. Fixes #25438. Change-Id: Ie55dc2c722352a5ecb17af6a16983741e8a8b515 Reviewed-on: https://go-review.googlesource.com/113735 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí Reviewed-by: Dominik Honnef Reviewed-by: Alan Donovan --- diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go index 7671d2a4bb..189bfb4223 100644 --- a/src/go/parser/parser.go +++ b/src/go/parser/parser.go @@ -1830,6 +1830,7 @@ func (p *parser) makeExpr(s ast.Stmt, want string) ast.Expr { func (p *parser) parseIfHeader() (init ast.Stmt, cond ast.Expr) { if p.tok == token.LBRACE { p.error(p.pos, "missing condition in if statement") + cond = &ast.BadExpr{From: p.pos, To: p.pos} return } // p.tok != token.LBRACE @@ -1877,6 +1878,11 @@ func (p *parser) parseIfHeader() (init ast.Stmt, cond ast.Expr) { } } + // make sure we have a valid AST + if cond == nil { + cond = &ast.BadExpr{From: p.pos, To: p.pos} + } + p.exprLev = outer return } diff --git a/src/go/types/testdata/issues.src b/src/go/types/testdata/issues.src index 8c11b376c8..da6dc6320a 100644 --- a/src/go/types/testdata/issues.src +++ b/src/go/types/testdata/issues.src @@ -240,3 +240,11 @@ func issue24140(x interface{}) int { panic(0) } } + +// Test that we don't crash when the 'if' condition is missing. +func issue25438() { + if { /* ERROR missing condition */ } + if x := 0; /* ERROR missing condition */ { _ = x } + if + { /* ERROR missing condition */ } +}