]> Cypherpunks repositories - gostls13.git/commitdiff
go/parser: permit parentheses in receiver types
authorRobert Griesemer <gri@golang.org>
Thu, 26 Jun 2014 16:45:11 +0000 (09:45 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 26 Jun 2014 16:45:11 +0000 (09:45 -0700)
Pending acceptance of CL 101500044
and adjustment of test/fixedbugs/bug299.go.

LGTM=adonovan
R=golang-codereviews, adonovan
CC=golang-codereviews
https://golang.org/cl/110160043

src/pkg/go/parser/parser.go
src/pkg/go/parser/short_test.go

index 00dd532b2395e86e45fb8f24f4563e455d561a4a..d16ba4cef36b065c9c180dd3289a8a9233319f2f 100644 (file)
@@ -2310,9 +2310,9 @@ func (p *parser) parseReceiver(scope *ast.Scope) *ast.FieldList {
                return par
        }
 
-       // recv type must be of the form ["*"] identifier
+       // recv type must be of the form ["*"] identifier, possibly using parentheses
        recv := par.List[0]
-       base := deref(recv.Type)
+       base := unparen(deref(unparen(recv.Type)))
        if _, isIdent := base.(*ast.Ident); !isIdent {
                if _, isBad := base.(*ast.BadExpr); !isBad {
                        // only report error if it's a new one
index b794060998f66de3d7b9ac639a06fcf0d101e3a1..9b8ac44717376a5adf91f150d085ef0daf7205e4 100644 (file)
@@ -35,6 +35,9 @@ var valids = []string{
        `package p; func f() { for _ = range "foo" + "bar" {} };`,
        `package p; func f() { var s []int; g(s[:], s[i:], s[:j], s[i:j], s[i:j:k], s[:j:k]) };`,
        `package p; var ( _ = (struct {*T}).m; _ = (interface {T}).m )`,
+       `package p; func ((T),) m() {}`,
+       `package p; func ((*T),) m() {}`,
+       `package p; func (*(T),) m() {}`,
 }
 
 func TestValid(t *testing.T) {