From c591d82ea99b70b251a51cefd11ddc42ff004ce6 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 4 Oct 2022 10:24:05 -0700 Subject: [PATCH] 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 --- src/cmd/compile/internal/syntax/parser.go | 22 +++++++++---------- .../internal/syntax/testdata/issue56022.go | 10 +++++++++ 2 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 src/cmd/compile/internal/syntax/testdata/issue56022.go 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$ */ () -- 2.50.0