diff options
author | Robert Griesemer <gri@golang.org> | 2015-09-14 16:59:15 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2015-09-16 20:06:38 +0000 |
commit | b0507f15798af22f2c23042ec6308702380112c4 (patch) | |
tree | a28a873ab303e476ee760644899a030869f36808 /src/go/parser/parser.go | |
parent | 5b3f29a2e791c2489e6de16d44f3a626ce81a0ec (diff) | |
download | go-b0507f15798af22f2c23042ec6308702380112c4.tar.gz go-b0507f15798af22f2c23042ec6308702380112c4.zip |
go/parser: better error message for incorrect type switch header
Fixes 11829.
Change-Id: I2e39f61e12953147b0cd6a11d29179c500c94964
Reviewed-on: https://go-review.googlesource.com/14566
Reviewed-by: Chris Manghane <cmang@golang.org>
Diffstat (limited to 'src/go/parser/parser.go')
-rw-r--r-- | src/go/parser/parser.go | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go index 521bdce1dd..73edaa0ab3 100644 --- a/src/go/parser/parser.go +++ b/src/go/parser/parser.go @@ -1910,14 +1910,23 @@ func isTypeSwitchAssert(x ast.Expr) bool { return ok && a.Type == nil } -func isTypeSwitchGuard(s ast.Stmt) bool { +func (p *parser) isTypeSwitchGuard(s ast.Stmt) bool { switch t := s.(type) { case *ast.ExprStmt: - // x.(nil) + // x.(type) return isTypeSwitchAssert(t.X) case *ast.AssignStmt: - // v := x.(nil) - return len(t.Lhs) == 1 && t.Tok == token.DEFINE && len(t.Rhs) == 1 && isTypeSwitchAssert(t.Rhs[0]) + // v := x.(type) + if len(t.Lhs) == 1 && len(t.Rhs) == 1 && isTypeSwitchAssert(t.Rhs[0]) { + switch t.Tok { + case token.ASSIGN: + // permit v = x.(type) but complain + p.error(t.TokPos, "expected ':=', found '='") + fallthrough + case token.DEFINE: + return true + } + } } return false } @@ -1963,7 +1972,7 @@ func (p *parser) parseSwitchStmt() ast.Stmt { p.exprLev = prevLev } - typeSwitch := isTypeSwitchGuard(s2) + typeSwitch := p.isTypeSwitchGuard(s2) lbrace := p.expect(token.LBRACE) var list []ast.Stmt for p.tok == token.CASE || p.tok == token.DEFAULT { |