E0292

A Scope handle that could outlive its scope block: Scope in a function's or method's return type, in a struct or enum field's type, or in the type of a scope block's value, including inside wrappers such as Option<Scope> or List<Scope>. Scope stays allowed as a parameter type. A closure that captures a Scope, or a value holding one, is scoped and cannot escape either: it cannot be a scope block's value, be returned, be stored in a field, or be passed to a user function's parameter (a prelude or std function, such as spawn or map, accepts it). A var declared outside a scope block cannot be left holding the handle or such a closure; this is conservative, and also rejects keeping a closure that captures an enclosing block's handle. Nor can a var that already holds a handle, of an enclosing block, take one of an inner block: inside a scope block, assigning to a var (or self) from outside it, or calling a mutating method such as push on one, is rejected when the value written mentions a local of the block that holds a Scope, such as its handle or a closure capturing it. A closure is scoped by what its captures hold when it is checked, so one that captures a value whose type is known only later, as in var xs = [] followed by let g = || xs.len() and then xs.push(s), is rejected when that type turns out to hold a Scope; declare the value with its type first. Spans the type, the closure, or the scope expression.

Machine-applicable fix: none.

Example

This program fails with E0292.

fn leak() -> Scope {
    scope |s| { s }
}

Fixed

The same program, fixed.

fn work() -> Int {
    1
}

fn run() -> Int {
    scope |s| {
        let task = s.spawn(|| work())
        task.join()
    }
}

Listed in the checker notes. oskac explain E0292 prints this entry offline.

All error codes