aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/syntax/parser.go
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2021-10-26 21:12:31 -0700
committerRobert Griesemer <gri@golang.org>2021-10-27 18:08:49 +0000
commitbb49eb3e6a464fbbebd425c4b84c32609b27ecf2 (patch)
treea1276fbe3de1306b0351f582b6a374537d13a68d /src/cmd/compile/internal/syntax/parser.go
parentc0ac39c70eeeaadbebe13efb407a1a272a926d30 (diff)
downloadgo-bb49eb3e6a464fbbebd425c4b84c32609b27ecf2.tar.xz
cmd/compile/internal/syntax: fix constraint literal parsing for generic functions
Fixes #49174. Change-Id: I943c370f7abd5f50a541e682f130b3526c3b5bdb Reviewed-on: https://go-review.googlesource.com/c/go/+/359014 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src/cmd/compile/internal/syntax/parser.go')
-rw-r--r--src/cmd/compile/internal/syntax/parser.go14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go
index e78e77561d..af5a505cdb 100644
--- a/src/cmd/compile/internal/syntax/parser.go
+++ b/src/cmd/compile/internal/syntax/parser.go
@@ -588,19 +588,24 @@ func (p *parser) typeDecl(group *Group) Decl {
d.Name = p.name()
if p.tok == _Lbrack {
// array/slice or generic type
+ // name "[" ...
pos := p.pos()
p.next()
switch p.tok {
case _Rbrack:
+ // name "[" "]" ...
p.next()
d.Type = p.sliceType(pos)
case _Name:
// array or generic type
+ // name "[" name ...
p.xnest++
+ // TODO(gri) p.expr may consume an opening "[" when it shouldn't (issue #49175)
x := p.expr()
p.xnest--
if name0, ok := x.(*Name); p.allowGenerics() && ok && p.tok != _Rbrack {
// generic type
+ // name "[" name ...
d.TParamList = p.paramList(name0, _Rbrack, true)
pos := p.pos()
if p.gotAssign() {
@@ -609,12 +614,14 @@ func (p *parser) typeDecl(group *Group) Decl {
d.Type = p.typeOrNil()
} else {
// x is the array length expression
+ // name "[" x ...
if debug && x == nil {
panic("length expression is nil")
}
d.Type = p.arrayType(pos, x)
}
default:
+ // name "[" ...
d.Type = p.arrayType(pos, nil)
}
} else {
@@ -1816,7 +1823,7 @@ func (p *parser) embeddedTerm() Expr {
// ParameterDecl = [ IdentifierList ] [ "..." ] Type .
func (p *parser) paramDeclOrNil(name *Name, follow token) *Field {
if trace {
- defer p.trace("paramDecl")()
+ defer p.trace("paramDeclOrNil")()
}
// type set notation is ok in type parameter lists
@@ -1849,6 +1856,11 @@ func (p *parser) paramDeclOrNil(name *Name, follow token) *Field {
// name "[" n "]" E
f.Name = name
}
+ if typeSetsOk && p.tok == _Operator && p.op == Or {
+ // name "[" ... "]" "|" ...
+ // name "[" n "]" E "|" ...
+ f = p.embeddedElem(f)
+ }
return f
}