[dev.typeparams] cmd/compile/internal/syntax: accept embedded type literals

The parser accepted embedded elements but the first term
of an element had to be a ~-term or a type name. This CL
fixes that.

Change-Id: I013b6cdc5963fb228867ca6597f9139db2be7ec5
Reviewed-on: https://go-review.googlesource.com/c/go/+/321109
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Robert Griesemer 2021-05-18 17:37:54 -07:00
parent f3fc8b5779
commit 81b22480cf
2 changed files with 57 additions and 1 deletions

View file

@ -1443,6 +1443,18 @@ func (p *parser) interfaceType() *InterfaceType {
}
return false
}
default:
if p.mode&AllowGenerics != 0 {
pos := p.pos()
if t := p.typeOrNil(); t != nil {
f := new(Field)
f.pos = pos
f.Type = t
typ.MethodList = append(typ.MethodList, p.embeddedElem(f))
return false
}
}
}
if p.mode&AllowGenerics != 0 {

View file

@ -25,7 +25,6 @@ type _ interface {
~int | ~string
}
type _ interface {
m()
~int
@ -34,3 +33,48 @@ type _ interface {
~int | ~string
type bool, int, float64
}
type _ interface {
int
[]byte
[10]int
struct{}
*int
func()
interface{}
map[string]int
chan T
chan<- T
<-chan T
T[int]
}
type _ interface {
int | string
[]byte | string
[10]int | string
struct{} | string
*int | string
func() | string
interface{} | string
map[string]int | string
chan T | string
chan<- T | string
<-chan T | string
T[int] | string
}
type _ interface {
~int | string
~[]byte | string
~[10]int | string
~struct{} | string
~*int | string
~func() | string
~interface{} | string
~map[string]int | string
~chan T | string
~chan<- T | string
~<-chan T | string
~T[int] | string
}