>From the RFC:

If `T` does not contain a `ref` or `closure` type, it is isolated. Else the 
syntactic structure of `x` is analyzed:

  * Atoms like `nil`, `4`, `"abc"` are isolated.
  * An array constructor `[x...]` is isolated if every element `x` is isolated.
  * An object constructor `Obj(x...)` is isolated if every element `x` is 
isolated.
  * An `if` or `case` expression is isolated if all possible values the 
expression may return are isolated.
  * A type conversion `C(x)` is isolated if `x` is isolated. Analogous for 
`cast` expressions.
  * A field access `x.field` is isolated if `x` is isolated.
  * An array/seq access `x[i]` is **not** isolated if `x` is isolated as 
otherwise code like `a.send x[i]; b.send x[i]` (send to two different channels) 
might compile.
  * A function call `f(x...)` is isolated if `f` is `.noSideEffect` and for 
every argument `x`:
    * `x` is isolated **or**
    * `f`'s return type cannot _alias_ `x`'s type. This is checked via a form 
of alias analysis as explained in the next paragraph.



It could be worded better but there is an analysis of the expression's shape 
performed and the shape cannot contain variables because they are not 
mentioned. But you're right, this is not obvious.

Reply via email to