cmd/compile/internal/syntax: set up dummy name and type if func name is missing

We do the same elsewhere (e.g. in parser.name when a name is missing).
This ensures functions have a (dummy) name and a non-nil type.
Avoids a crash in the type-checker (verified manually).
A test was added here (rather than the type checker) because type-
checker tests are shared between types2 and go/types and error
recovery in this case is different.

Fixes #63835.

Change-Id: I1460fc88d23d80b8d8c181c774d6b0a56ca06317
Reviewed-on: https://go-review.googlesource.com/c/go/+/538059
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Bypass: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
This commit is contained in:
Robert Griesemer 2023-10-30 17:00:07 -07:00 committed by Gopher Robot
parent 25a59decd5
commit b7a66be69c
2 changed files with 12 additions and 0 deletions

View File

@ -798,6 +798,9 @@ func (p *parser) funcDeclOrNil() *FuncDecl {
f.Name = p.name()
f.TParamList, f.Type = p.funcType(context)
} else {
f.Name = NewName(p.pos(), "_")
f.Type = new(FuncType)
f.Type.pos = p.pos()
msg := "expected name or ("
if context != "" {
msg = "expected name"

View File

@ -0,0 +1,9 @@
// Copyright 2023 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
func (x string) /* ERROR syntax error: unexpected \[, expected name */ []byte {
return []byte(x)
}