mirror of
https://github.com/golang/go
synced 2024-11-23 06:00:08 -07:00
cmd/compile/internal/syntax: make valid type parameter list in presence of errors
Make sure the parser fills in names and types for type parameter lists, even in the case of errors. While at it, adjust some of the test functions to accept generic code and report all syntax errors. Added offending source as test for types2. Fixes #47996. Change-Id: I449bcf5e2cb80fa2a24cdd3945f484bfca218a06 Reviewed-on: https://go-review.googlesource.com/c/go/+/345476 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
d350a66532
commit
2c60a99f72
@ -13,11 +13,7 @@ func TestDump(t *testing.T) {
|
||||
t.Skip("skipping test in short mode")
|
||||
}
|
||||
|
||||
// provide a no-op error handler so parsing doesn't stop after first error
|
||||
ast, err := ParseFile(*src_, func(error) {}, nil, CheckBranches)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
ast, _ := ParseFile(*src_, func(err error) { t.Error(err) }, nil, CheckBranches|AllowGenerics)
|
||||
|
||||
if ast != nil {
|
||||
Fdump(testOut(), ast)
|
||||
|
@ -1924,7 +1924,7 @@ func (p *parser) paramList(name *Name, close token, requireNames bool) (list []*
|
||||
}
|
||||
|
||||
// distribute parameter types (len(list) > 0)
|
||||
if named == 0 {
|
||||
if named == 0 && !requireNames {
|
||||
// all unnamed => found names are named types
|
||||
for _, par := range list {
|
||||
if typ := par.Name; typ != nil {
|
||||
@ -1932,9 +1932,6 @@ func (p *parser) paramList(name *Name, close token, requireNames bool) (list []*
|
||||
par.Name = nil
|
||||
}
|
||||
}
|
||||
if requireNames {
|
||||
p.syntaxErrorAt(list[0].Type.Pos(), "type parameters must be named")
|
||||
}
|
||||
} else if named != len(list) {
|
||||
// some named => all must have names and types
|
||||
var pos Pos // left-most error position (or unknown)
|
||||
|
@ -18,11 +18,7 @@ func TestPrint(t *testing.T) {
|
||||
t.Skip("skipping test in short mode")
|
||||
}
|
||||
|
||||
// provide a no-op error handler so parsing doesn't stop after first error
|
||||
ast, err := ParseFile(*src_, func(error) {}, nil, 0)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
ast, _ := ParseFile(*src_, func(err error) { t.Error(err) }, nil, AllowGenerics)
|
||||
|
||||
if ast != nil {
|
||||
Fprint(testOut(), ast, LineForm)
|
||||
|
8
src/cmd/compile/internal/types2/testdata/fixedbugs/issue47996.go2
vendored
Normal file
8
src/cmd/compile/internal/types2/testdata/fixedbugs/issue47996.go2
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
// Copyright 2021 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package p
|
||||
|
||||
// don't crash
|
||||
func T /* ERROR missing */ [P /* ERROR named */ ] m /* ERROR m */ () /* ERROR \) */ { /* ERROR { */ } /* ERROR } */
|
Loading…
Reference in New Issue
Block a user