From d9c22424e70b00636207bc73b25b6cf026fe9347 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 24 Jun 2014 16:25:09 -0700 Subject: spec: receiver declaration is just a parameter declaration This CL removes the special syntax for method receivers and makes it just like other parameters. Instead, the crucial receiver-specific rules (exactly one receiver, receiver type must be of the form T or *T) are specified verbally instead of syntactically. This is a fully backward-compatible (and minor) syntax relaxation. As a result, the following syntactic restrictions (which are completely irrelevant) and which were only in place for receivers are removed: a) receiver types cannot be parenthesized b) receiver parameter lists cannot have a trailing comma The result of this CL is a simplication of the spec and the implementation, with no impact on existing (or future) code. Noteworthy: - gc already permits a trailing comma at the end of a receiver declaration: func (recv T,) m() {} This is technically a bug with the current spec; this CL will legalize this notation. - gccgo produces a misleading error when a trailing comma is used: error: method has multiple receivers (even though there's only one receiver) - Compilers and type-checkers won't need to report errors anymore if receiver types are parenthesized. Fixes issue 4496. LGTM=iant, rsc R=r, rsc, iant, ken CC=golang-codereviews https://codereview.appspot.com/101500044 --- doc/go_spec.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'doc') diff --git a/doc/go_spec.html b/doc/go_spec.html index baa0ecf40..ca9e50203 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -2029,13 +2029,14 @@ and associates the method with the receiver's base type.
 MethodDecl   = "func" Receiver MethodName ( Function | Signature ) .
-Receiver     = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
-BaseTypeName = identifier .
+Receiver     = Parameters .
 

-The receiver type must be of the form T or *T where -T is a type name. The type denoted by T is called +The receiver is specified via an extra parameter section preceeding the method +name. That parameter section must declare a single parameter, the receiver. +Its type must be of the form T or *T (possibly using +parentheses) where T is a type name. The type denoted by T is called the receiver base type; it must not be a pointer or interface type and it must be declared in the same package as the method. The method is said to be bound to the base type and the method name -- cgit v1.2.1