new scope rules
DELTA=137 (50 added, 24 deleted, 63 changed)
OCL=33476
CL=33553
diff --git a/doc/go_spec.html b/doc/go_spec.html
index 7680843..7f85013 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -10,9 +10,7 @@
Todo's:
[ ] need language about function/method calls and parameter passing rules
-[ ] clarify new scope rules for package-level identifiers
-[ ] clarify scope of identifiers denoting imported packages (file scope)
-[ ] package identifier not in any scope
+[ ] need to say something about "scope" of selectors?
[ ] clarify what a field name is in struct declarations
(struct{T} vs struct {T T} vs struct {t T})
[ ] need explicit language about the result type of operations
@@ -1226,74 +1224,119 @@
<hr/>
-<h2>Declarations and Scope</h2>
+<h2>Blocks</h2>
<p>
-A declaration binds an identifier to a language entity such as
-a variable or function and specifies properties such as its type.
-Every identifier in a program must be declared.
+A <i>block</i> is a sequence of declarations and statements within matching
+brace brackets.
</p>
<pre class="ebnf">
-Declaration = ConstDecl | TypeDecl | VarDecl | FunctionDecl | MethodDecl .
+Block = "{" StatementList "}" .
</pre>
<p>
-The <i>scope</i> of an identifier is the extent of source text within which the
-identifier denotes the bound entity. No identifier may be declared twice in a
-single scope, but inner blocks can declare a new entity with the same
-identifier, in which case the scope created by the outer declaration excludes
-that created by the inner.
-</p>
-<p>
-There are levels of scoping in effect before each source file is compiled.
-In order from outermost to innermost:
-</p>
-<ol>
- <li>The <i>universe</i> scope contains all predeclared identifiers.</li>
- <li>An implicit scope contains only the package name.</li>
- <li>The <i>package-level</i> scope surrounds all declarations at the
- top level of the file, that is, outside the body of any
- function or method. That scope is shared across all
- source files within the package (§Packages), allowing
- package-level identifiers to be shared between source
- files.</li>
-</ol>
-
-<p>
-The scope of an identifier depends on the entity declared:
+In addition to explicit blocks in the source code, there are implicit blocks:
</p>
<ol>
- <li> The scope of predeclared identifiers is the universe scope.</li>
+ <li>The <i>universe block</i> encompasses all Go source text.</li>
- <li> The scope of an identifier denoting a type, function or package
- extends from the point of the identifier in the declaration
- to the end of the innermost surrounding block.</li>
+ <li>Each package (§Packages) has a <i>package block</i> containing all
+ Go source text for that package.</li>
- <li> The scope of a constant or variable extends textually from
- the end of its declaration to the end of the innermost
- surrounding block. If the variable is declared in the
- <i>init</i> statement of an <code>if</code>, <code>for</code>,
- or <code>switch </code> statement, the
- innermost surrounding block is the block associated
- with that statement.</li>
+ <li>Each file has a <i>file block</i> containing all Go source text
+ in that file.</li>
- <li> The scope of a parameter or result is the body of the
- corresponding function.</li>
+ <li>Each <code>if</code>, <code>for</code>, and <code>switch</code>
+ statement is considered to be in its own implicit block.</li>
- <li> The scope of a field or method is selectors for the
- corresponding type containing the field or method (§Selectors).</li>
-
- <li> The scope of a label is a special scope emcompassing
- the body of the innermost surrounding function, excluding
- nested functions. Labels do not conflict with non-label identifiers.</li>
+ <li>Each case or type case clause in a <code>switch</code> statement,
+ and each communication clause in a <code>select</code> statement
+ acts as an implicit block.</li>
</ol>
+<p>
+Blocks nest and influence scoping (§Declarations and Scope).
+</p>
+
+
+<h2>Declarations and Scope</h2>
+
+<p>
+A declaration binds an identifier to a constant, type, variable, function, or package.
+Every identifier in a program must be declared.
+No identifier may be declared twice in the same block, and
+no identifier may be declared in both the file and package block.
+</p>
+
+<pre class="ebnf">
+Declaration = ConstDecl | TypeDecl | VarDecl .
+TopLevelDecl = Declaration | FunctionDecl | MethodDecl .
+</pre>
+
+<p>
+The <i>scope</i> of a declared identifier is the extent of source text in which
+the identifier denotes the specified constant, type, variable, function, or package.
+</p>
+
+<p>
+Go is lexically scoped using blocks:
+</p>
+
+<ol>
+ <li>The scope of a predeclared identifier is the universe block.</li>
+
+ <li>The scope of an identifier denoting a constant, type, variable,
+ or function declared at top level (outside any function) is the
+ package block.</li>
+
+ <li>The scope of an imported package identifier is the file block
+ of the file containing the import declaration.</li>
+
+ <li>The scope of an identifier denoting a function parameter or
+ result variable is the function body.</li>
+
+ <li>The scope of a constant or variable identifier declared
+ inside a function begins at the end of the ConstSpec or VarSpec
+ and ends at the end of the innermost containing block.</li>
+
+ <li>The scope of a type identifier declared inside a function
+ begins immediately after the identifier in the TypeSpec
+ and ends at the end of the innermost containing block.</li>
+</ol>
+
+<p>
+An identifier declared in a block may be redeclared in an inner block.
+While the identifier of the inner declaration is in scope, it denotes
+the entity declared by the inner declaration.
+</p>
+
+<p>
+The package clause (§Package clause) is not a declaration; the package name
+does not appear in any scope. Its purpose is to identify the files belonging
+to the same package (§Packages) and to specify the default name for import
+declarations.
+</p>
+
+
+<h3>Label scopes</h3>
+
+<p>
+Labels are declared by labeled statements (§Labeled statements) and are
+used in the <code>break</code>, <code>continue</code>, and <code>goto</code>
+statements (§Break statements, §Continue statements, §Goto statements).
+In contrast to other identifiers, labels are not block scoped and do
+not conflict with identifiers that are not labels. The scope of a label
+is the body of the function in which it is declared and excludes
+the body of any nested function.
+</p>
+
+
<h3>Predeclared identifiers</h3>
<p>
-The following identifiers are implicitly declared in the outermost scope:
+The following identifiers are implicitly declared in the universe block:
</p>
<pre class="grammar">
Basic types:
@@ -1593,7 +1636,8 @@
</p>
<pre class="ebnf">
-FunctionDecl = "func" identifier Signature [ Block ] .
+FunctionDecl = "func" identifier Signature [ Body ] .
+Body = Block.
</pre>
<p>
@@ -1612,10 +1656,6 @@
func flushICache(begin, end uintptr) // implemented externally
</pre>
-<p>
-Implementation restriction: Functions can only be declared at the package level.
-</p>
-
<h3>Method declarations</h3>
<p>
@@ -1623,7 +1663,7 @@
which is a function with a <i>receiver</i>.
</p>
<pre class="ebnf">
-MethodDecl = "func" Receiver identifier Signature [ Block ] .
+MethodDecl = "func" Receiver identifier Signature [ Body ] .
Receiver = "(" [ identifier ] [ "*" ] TypeName ")" .
</pre>
@@ -1665,10 +1705,6 @@
</p>
<p>
-Implementation restriction: They can only be declared at package level.
-</p>
-
-<p>
The type of a method is the type of a function with the receiver as first
argument. For instance, the method <code>Scale</code> has type
</p>
@@ -1918,8 +1954,7 @@
</p>
<pre class="ebnf">
-FunctionLit = FunctionType Block .
-Block = "{" StatementList "}" .
+FunctionLit = FunctionType Body .
</pre>
<pre>
@@ -3218,10 +3253,7 @@
the first statement of the next clause.
Otherwise control flows to the end of the "switch" statement.
</p>
-<p>
-Each case clause acts as a block for scoping purposes
-(§Declarations and scope rules).
-</p>
+
<p>
A "switch" statement may include a simple statement before the
expression.
@@ -3506,10 +3538,6 @@
</pre>
<p>
-Each communication clause acts as a block for the purpose of scoping
-(§Declarations and scope rules).
-</p>
-<p>
For all the send and receive expressions in the "select"
statement, the channel expression is evaluated. Any expressions
that appear on the right hand side of send expressions are also
@@ -3973,13 +4001,11 @@
to which it belongs, followed by a possibly empty set of import
declarations that declare packages whose contents it wishes to use,
followed by a possibly empty set of declarations of functions,
-types, variables, and constants. The source text following the
-package clause acts as a block for scoping (§Declarations and scope
-rules).
+types, variables, and constants.
</p>
<pre class="ebnf">
-SourceFile = PackageClause { ImportDecl [ ";" ] } { Declaration [ ";" ] } .
+SourceFile = PackageClause { ImportDecl [ ";" ] } { TopLevelDecl [ ";" ] } .
</pre>
<h3>Package clause</h3>
@@ -4002,7 +4028,7 @@
An implementation may require that all source files for a package inhabit the same directory.
</p>
-<h3>Import</h3>
+<h3>Import declarations</h3>
<p>
A source file gains access to exported identifiers (§Exported