Commit 87169813 authored by Robert Griesemer's avatar Robert Griesemer

spec: clarify what is considered a function call for len/cap special case

gccgo considers built-in function calls returning a constant not as function call (issue 7386)
go/types considers any call (regular or built-in) as a function call

The wording and examples clarify that only "function calls" that are issued
at run-time (and thus do not result in a constant result) are considered
function calls in this case.

gc is inconsistent (issue 7385)
gccgo already interprets the spec accordingly and issue 7386 is moot.
go/types considers all calls (constant or not) as function calls (issue 7457).

Fixes #7387.
Fixes #7386.

LGTM=r, rsc, iant
R=r, rsc, iant, ken
CC=golang-codereviews
https://golang.org/cl/66860046
parent 709b12ff
<!--{ <!--{
"Title": "The Go Programming Language Specification", "Title": "The Go Programming Language Specification",
"Subtitle": "Version of Feb 27, 2014", "Subtitle": "Version of March 4, 2014",
"Path": "/ref/spec" "Path": "/ref/spec"
}--> }-->
...@@ -5271,12 +5271,22 @@ The expression <code>len(s)</code> is <a href="#Constants">constant</a> if ...@@ -5271,12 +5271,22 @@ The expression <code>len(s)</code> is <a href="#Constants">constant</a> if
<code>s</code> is a string constant. The expressions <code>len(s)</code> and <code>s</code> is a string constant. The expressions <code>len(s)</code> and
<code>cap(s)</code> are constants if the type of <code>s</code> is an array <code>cap(s)</code> are constants if the type of <code>s</code> is an array
or pointer to an array and the expression <code>s</code> does not contain or pointer to an array and the expression <code>s</code> does not contain
<a href="#Receive_operator">channel receives</a> or <a href="#Receive_operator">channel receives</a> or (non-constant)
<a href="#Calls">function calls</a>; in this case <code>s</code> is not evaluated. <a href="#Calls">function calls</a>; in this case <code>s</code> is not evaluated.
Otherwise, invocations of <code>len</code> and <code>cap</code> are not Otherwise, invocations of <code>len</code> and <code>cap</code> are not
constant and <code>s</code> is evaluated. constant and <code>s</code> is evaluated.
</p> </p>
<pre>
const (
c1 = imag(2i) // imag(2i) = 2.0 is a constant
c2 = len([10]float64{2}) // [10]float64{2} contains no function calls
c3 = len([10]float64{c1}) // [10]float64{c1} contains no function calls
c4 = len([10]float64{imag(2i)}) // imag(2i) is a constant and no function call is issued
c5 = len([10]float64{imag(z)}) // invalid: imag(x) is a (non-constant) function call
)
var z complex128
</pre>
<h3 id="Allocation">Allocation</h3> <h3 id="Allocation">Allocation</h3>
......
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