From: Robert Griesemer Date: Tue, 31 Oct 2023 00:00:07 +0000 (-0700) Subject: cmd/compile/internal/syntax: set up dummy name and type if func name is missing X-Git-Tag: go1.22rc1~481 X-Git-Url: http://www.git.cypherpunks.ru/?a=commitdiff_plain;h=b7a66be69c5857105c4b357d87bb76da87b1dbed;p=gostls13.git 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 TryBot-Bypass: Robert Griesemer Reviewed-by: Robert Griesemer Run-TryBot: Robert Griesemer Auto-Submit: Robert Griesemer --- diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index 913a2f164c..3895f53cf7 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -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" diff --git a/src/cmd/compile/internal/syntax/testdata/issue63835.go b/src/cmd/compile/internal/syntax/testdata/issue63835.go new file mode 100644 index 0000000000..3d165c016e --- /dev/null +++ b/src/cmd/compile/internal/syntax/testdata/issue63835.go @@ -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) +}