>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.