aboutsummaryrefslogtreecommitdiff
path: root/src/go/parser/parser.go
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2015-09-14 16:59:15 -0700
committerRobert Griesemer <gri@golang.org>2015-09-16 20:06:38 +0000
commitb0507f15798af22f2c23042ec6308702380112c4 (patch)
treea28a873ab303e476ee760644899a030869f36808 /src/go/parser/parser.go
parent5b3f29a2e791c2489e6de16d44f3a626ce81a0ec (diff)
downloadgo-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.go19
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 {