go spec: constant divisors must not be zero
Both gc and gccgo always checked this for constant
expressions but the spec only mentions run-time
exceptions.
This CL also requires that constant divisors
must not be zero in non-constant integer expressions:
This is consistent with the spirit of the most
recent changes and it is consistent with constant
expressions. We don't want to specify the effect for
non-integer expressions (f/0.0 where f is a float or
complex number) because there the result f/g is not
further specified if a non-constant g is 0.
R=r, rsc, iant, ken, andybalholm, iant
CC=golang-dev
https://golang.org/cl/6710045
diff --git a/doc/go_spec.html b/doc/go_spec.html
index 45dd1e2..a658636 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -3001,7 +3001,8 @@
</pre>
<p>
-If the divisor is zero, a <a href="#Run_time_panics">run-time panic</a> occurs.
+If the divisor is a <a href="#Constants">constant</a>, it must not be zero.
+If the divisor is zero at run time, a <a href="#Run_time_panics">run-time panic</a> occurs.
If the dividend is positive and the divisor is a constant power of 2,
the division may be replaced by a right shift, and computing the remainder may
be replaced by a bitwise AND operation:
@@ -3693,6 +3694,14 @@
</pre>
<p>
+The divisor of a constant division or remainder operation must not be zero:
+</p>
+
+<pre>
+3.14 / 0.0 // illegal: division by zero
+</pre>
+
+<p>
The values of <i>typed</i> constants must always be accurately representable as values
of the constant type. The following constant expressions are illegal:
</p>
@@ -4759,8 +4768,6 @@
(See also the section on <a href="#Handling_panics">handling panics</a>.)
</p>
-</p>
-
<pre>
lock(l)
defer unlock(l) // unlocking happens before surrounding function returns