summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2022-10-04 10:24:05 -0700
committerRobert Griesemer <gri@google.com>2022-10-05 01:05:29 +0000
commitc591d82ea99b70b251a51cefd11ddc42ff004ce6 (patch)
tree971b3e9c16a828a7bdb4f26b2141e5c8eb141254
parentd1187438694d68d1d761355cd1268057a6521619 (diff)
downloadgo-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.go22
-rw-r--r--src/cmd/compile/internal/syntax/testdata/issue56022.go10
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$ */ ()