Go specification: Lock down some details about channels and select:
- nil channel in regular send or receive panics
- empty select blocks forever
R=rsc, gri, iant, ken2
CC=golang-dev
https://golang.org/cl/1825043
diff --git a/doc/go_spec.html b/doc/go_spec.html
index 13c4c24..598bc92 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -17,7 +17,6 @@
[ ] specify iteration direction for range clause
[ ] review language on implicit dereferencing
[ ] clarify what it means for two functions to be "the same" when comparing them
-[ ] need to specify what happends when sending/receiving from a nil channel
-->
@@ -3063,6 +3062,12 @@
zero value for its type (§<a href="#The_zero_value">The zero value</a>).
</p>
+<p>
+Except in a communications clause of a <a href="#Select_statements">select statement</a>,
+sending or receiving from a <code>nil</code> channel causes a
+<a href="#Run_time_panics">run-time panic</a>.
+</p>
+
<!---
<p>
<span class="alert">TODO: Probably in a separate section, communication semantics
@@ -4048,18 +4053,22 @@
<p>
For all the send and receive expressions in the "select"
-statement, the channel expressions are evaluated, along with
-any expressions that appear on the right hand side of send expressions,
-in top-to-bottom order.
-If any of the resulting operations can proceed, one is
-chosen and the corresponding communication and statements are
-evaluated. Otherwise, if there is a default case, that executes;
-if not, the statement blocks until one of the communications can
-complete. The channels and send expressions are not re-evaluated.
+statement, the channel expressions are evaluated in top-to-bottom order, along with
+any expressions that appear on the right hand side of send expressions.
A channel pointer may be <code>nil</code>,
which is equivalent to that case not
being present in the select statement
except, if a send, its expression is still evaluated.
+If any of the resulting operations can proceed, one of those is
+chosen and the corresponding communication and statements are
+evaluated. Otherwise, if there is a default case, that executes;
+if there is no default case, the statement blocks until one of the communications can
+complete.
+If there are no cases with non-<code>nil</code> channels,
+the statement blocks forever.
+Even if the statement blocks,
+the channel and send expressions are evaluated only once,
+upon entering the select statement.
</p>
<p>
Since all the channels and send expressions are evaluated, any side
@@ -4067,7 +4076,7 @@
in the "select" statement.
</p>
<p>
-If multiple cases can proceed, a uniform fair choice is made to decide
+If multiple cases can proceed, a pseudo-random fair choice is made to decide
which single communication will execute.
<p>
The receive case may declare a new variable using a
@@ -4092,6 +4101,8 @@
case c <- 1:
}
}
+
+select { } // block forever
</pre>