From db37e1600fb2fc698b14e745005c4cf44251d2a9 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 17 May 2018 23:56:11 -0400 Subject: [PATCH] go/parser: make sure we have a valid AST when 'if' condition is missing MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/go/parser/parser.go | 6 ++++++ src/go/types/testdata/issues.src | 8 ++++++++ 2 files changed, 14 insertions(+) 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 */ } +} -- 2.50.0