From: Robert Griesemer Date: Tue, 4 Oct 2022 17:24:05 +0000 (-0700) Subject: cmd/compile/internal/syntax: better error message for erroneous method declaration X-Git-Tag: go1.20rc1~737 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c591d82ea99b70b251a51cefd11ddc42ff004ce6;p=gostls13.git cmd/compile/internal/syntax: better error message for erroneous method declaration Also make error recovery slightly more robust in this case. Fixes #56022. Change-Id: I1c01c1465adb48c71367d037b6f0e3fe56f68ec9 Reviewed-on: https://go-review.googlesource.com/c/go/+/438540 Run-TryBot: Robert Griesemer Reviewed-by: Robert Griesemer Auto-Submit: Robert Griesemer Reviewed-by: Robert Findley TryBot-Result: Gopher Robot --- diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index b31b712f1d..d80b269557 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -767,7 +767,9 @@ func (p *parser) funcDeclOrNil() *FuncDecl { f.pos = p.pos() f.Pragma = p.takePragma() + var context string if p.got(_Lparen) { + context = "method" rcvr := p.paramList(nil, nil, _Rparen, false) switch len(rcvr) { case 0: @@ -780,19 +782,17 @@ func (p *parser) funcDeclOrNil() *FuncDecl { } } - if p.tok != _Name { - p.syntaxError("expected name or (") + if p.tok == _Name { + f.Name = p.name() + f.TParamList, f.Type = p.funcType(context) + } else { + msg := "expected name or (" + if context != "" { + msg = "expected name" + } + p.syntaxError(msg) p.advance(_Lbrace, _Semi) - return nil - } - - f.Name = p.name() - - context := "" - if f.Recv != nil { - context = "method" // don't permit (method) type parameters in funcType } - f.TParamList, f.Type = p.funcType(context) if p.tok == _Lbrace { f.Body = p.funcBody() diff --git a/src/cmd/compile/internal/syntax/testdata/issue56022.go b/src/cmd/compile/internal/syntax/testdata/issue56022.go new file mode 100644 index 0000000000..d28d35cd8e --- /dev/null +++ b/src/cmd/compile/internal/syntax/testdata/issue56022.go @@ -0,0 +1,10 @@ +// Copyright 2022 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 /* ERROR unexpected {, expected name or \($ */ {} +func (T) /* ERROR unexpected {, expected name$ */ {} +func (T) /* ERROR unexpected \(, expected name$ */ () {} +func (T) /* ERROR unexpected \(, expected name$ */ ()