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 | |
parent | d1187438694d68d1d761355cd1268057a6521619 (diff) | |
download | go-git-c591d82ea99b70b251a51cefd11ddc42ff004ce6.tar.gz |
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>
-rw-r--r-- | src/cmd/compile/internal/syntax/parser.go | 22 | ||||
-rw-r--r-- | src/cmd/compile/internal/syntax/testdata/issue56022.go | 10 |
2 files changed, 21 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() 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$ */ () |