diff options
| author | Robert Griesemer <gri@golang.org> | 2022-10-04 10:24:05 -0700 |
|---|---|---|
| committer | Robert Griesemer <gri@google.com> | 2022-10-05 01:05:29 +0000 |
| commit | c591d82ea99b70b251a51cefd11ddc42ff004ce6 (patch) | |
| tree | 971b3e9c16a828a7bdb4f26b2141e5c8eb141254 /src/cmd/compile/internal/syntax/parser.go | |
| parent | d1187438694d68d1d761355cd1268057a6521619 (diff) | |
| download | go-c591d82ea99b70b251a51cefd11ddc42ff004ce6.tar.xz | |
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 <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/syntax/parser.go')
| -rw-r--r-- | src/cmd/compile/internal/syntax/parser.go | 22 |
1 files changed, 11 insertions, 11 deletions
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() |
