diff options
| author | Robert Griesemer <gri@golang.org> | 2018-05-17 23:56:11 -0400 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2018-05-18 16:01:32 +0000 |
| commit | db37e1600fb2fc698b14e745005c4cf44251d2a9 (patch) | |
| tree | 379fb5de04ddc7e35c73d7caa0915141545bf100 /src | |
| parent | 8a16c71067ca2cfd09281a82ee150a408095f0bc (diff) | |
| download | go-db37e1600fb2fc698b14e745005c4cf44251d2a9.tar.xz | |
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 <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Daniel Martà <mvdan@mvdan.cc>
Reviewed-by: Dominik Honnef <dominik@honnef.co>
Reviewed-by: Alan Donovan <adonovan@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/go/parser/parser.go | 6 | ||||
| -rw-r--r-- | src/go/types/testdata/issues.src | 8 |
2 files changed, 14 insertions, 0 deletions
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 */ } +} |
