Commit ddddd39f authored by Robert Griesemer's avatar Robert Griesemer

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
parent 3bde0003
...@@ -3001,7 +3001,8 @@ int64 -9223372036854775808 ...@@ -3001,7 +3001,8 @@ int64 -9223372036854775808
</pre> </pre>
<p> <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, 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 the division may be replaced by a right shift, and computing the remainder may
be replaced by a bitwise AND operation: be replaced by a bitwise AND operation:
...@@ -3692,6 +3693,14 @@ const Huge = 1 &lt;&lt; 100 ...@@ -3692,6 +3693,14 @@ const Huge = 1 &lt;&lt; 100
const Four int8 = Huge &gt;&gt; 98 const Four int8 = Huge &gt;&gt; 98
</pre> </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> <p>
The values of <i>typed</i> constants must always be accurately representable as values The values of <i>typed</i> constants must always be accurately representable as values
of the constant type. The following constant expressions are illegal: of the constant type. The following constant expressions are illegal:
...@@ -4759,8 +4768,6 @@ the function completes. ...@@ -4759,8 +4768,6 @@ the function completes.
(See also the section on <a href="#Handling_panics">handling panics</a>.) (See also the section on <a href="#Handling_panics">handling panics</a>.)
</p> </p>
</p>
<pre> <pre>
lock(l) lock(l)
defer unlock(l) // unlocking happens before surrounding function returns defer unlock(l) // unlocking happens before surrounding function returns
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment