aboutsummaryrefslogtreecommitdiff
path: root/src/go/parser/parser.go
diff options
context:
space:
mode:
authorRob Findley <rfindley@google.com>2021-01-15 11:08:02 -0500
committerRobert Findley <rfindley@google.com>2021-01-19 21:28:51 +0000
commit958927c8249fc7e073ffa5e5f0a8f7d3498b5616 (patch)
treeca741fdb26b8ee61e237f640075ce81400f87236 /src/go/parser/parser.go
parent90bfc7307175c2f58d4efb48003670dba23385ed (diff)
downloadgo-958927c8249fc7e073ffa5e5f0a8f7d3498b5616.tar.gz
go-958927c8249fc7e073ffa5e5f0a8f7d3498b5616.zip
[dev.typeparams] go/parser: error for type instances without ParseTypeParams
It should be an invariant that the parser does not produce ast.CallExprs with Brackets == true unless parsing with ParseTypeParams. Fix the one case where this invariant was violated, and add a test for errors produced in valid generic code when ParseTypeParams is unset. We did have some coverage of errors in short_test.go, but I find them to be easier to read in a testdata file and would like to gradually migrate them there. Change-Id: If2d174377087daa1b820cabc2b5bf8bcb0b39d8e Reviewed-on: https://go-review.googlesource.com/c/go/+/284192 Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org> Trust: Robert Griesemer <gri@golang.org> Trust: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src/go/parser/parser.go')
-rw-r--r--src/go/parser/parser.go7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go
index 24e84d5103..ccbcef8f26 100644
--- a/src/go/parser/parser.go
+++ b/src/go/parser/parser.go
@@ -1494,6 +1494,7 @@ func (p *parser) parseIndexOrSliceOrInstance(x ast.Expr) ast.Expr {
var args []ast.Expr
var index [N]ast.Expr
var colons [N - 1]token.Pos
+ var firstComma token.Pos
if p.tok != token.COLON {
// We can't know if we have an index expression or a type instantiation;
// so even if we see a (named) type we are not going to be in type context.
@@ -1512,6 +1513,7 @@ func (p *parser) parseIndexOrSliceOrInstance(x ast.Expr) ast.Expr {
}
}
case token.COMMA:
+ firstComma = p.pos
// instance expression
args = append(args, index[0])
for p.tok == token.COMMA {
@@ -1549,6 +1551,11 @@ func (p *parser) parseIndexOrSliceOrInstance(x ast.Expr) ast.Expr {
return &ast.IndexExpr{X: x, Lbrack: lbrack, Index: index[0], Rbrack: rbrack}
}
+ if p.mode&ParseTypeParams == 0 {
+ p.error(firstComma, "expected ']' or ':', found ','")
+ return &ast.BadExpr{From: args[0].Pos(), To: args[len(args)-1].End()}
+ }
+
// instance expression
return &ast.CallExpr{Fun: x, Lparen: lbrack, Args: args, Rparen: rbrack, Brackets: true}
}