Skip to main content

FnRow

Struct FnRow 

Source
pub struct FnRow(/* private fields */);
Expand description

The effect row riding a Ty::Fndocs/effects-spec.md §5 (“rows ride the unifier — the heap answer”), issue #1680 step 3.

What a row is, concretely. §7 rules that “the runtime never computes a row … a live fn value is a token; its row is a table lookup in the shipped DefinitionId → row table. So the thing a type has to carry is not a computed EffectRow but the set of in-project creation targets whose fn values may inhabit the slot — the keys that table is looked up by. §6.1a is what makes that the right (and the only acyclic) choice: “§6.1 fixes every fn value’s row at its creation site and creation sites are syntactic: #fn(g) names g literally, and bind copies from an already-known value rather than naming a new target.” A target set is therefore structural evidence, never an inferred row, so growing it onto Ty cannot put an inferred row inside the call_graph → scc_membership → solve_scc fixpoint the way Fork A’s rejected shape would have.

The lattice. unknown is the top element (the conservative-total floor of §3): “some fn value from a source this slot’s type cannot name may reach here”. FnRow::join is set union with unknown absorbing, which is exactly §5’s “a cell or collection’s element type accumulates the join of every fn value assigned into it, through copies, parameters, returns, and nesting”. That absorption is on the unknown row, not on every untraceable-looking write: a write typed plain Ty::Unknown (an unresolved reference, or an unregistered EXTERNAL’s return) unifies through Ty::Unknown’s own identity arm, not through this lattice at all, and so leaves the other operand’s row untouched rather than poisoning it to unknown.

Not yet read by the effect walk. def_effect_atoms deliberately runs the body walk with empty globals and empty signatures (§6.1a’s acyclicity is load-bearing on that), so a #fn literal types as Unknown there and this row is invisible to effect inference as currently constructed. Wiring §6 mechanism 3 — the heap — means deciding which stratum reads the type-carried row, which the 2026-07-28 sitting did not settle; see docs/effects-spec.md §6.1c.

Represented as an Option<Box<…>> so the common Ty::Fn stays one pointer wider rather than three words wider — Ty is copied constantly through the join.

Implementations§

Source§

impl FnRow

Source

pub fn unknown() -> Self

The top element: nothing is known about where the values inhabiting this slot were created. Also Default, so every Ty::Fn built without explicit creation evidence is conservative by construction.

Source

pub fn of_target(target: DefinitionId) -> Self

The row of a fn value created here, at a #fn(target, …) literal naming target — the one syntactic creation form (§6.1a).

Source

pub fn empty() -> Self

The empty row: this slot provably holds no in-project fn value. Only reachable through a join that started here; never minted directly.

Source

pub fn is_unknown(&self) -> bool

true when this row is the top element (FnRow::unknown).

Source

pub fn targets(&self) -> Option<&BTreeSet<DefinitionId>>

The creation targets, or None when the row is the top element. A caller that wants the conservative reading must treat None as “every target”, never as “no targets”.

Source

pub fn join(&self, other: &FnRow) -> FnRow

Least upper bound: union of the target sets, with the top element absorbing. Monotone over a finite per-project lattice, so folding it through unify terminates for the same reason the rest of the join does.

Trait Implementations§

Source§

impl Clone for FnRow

Source§

fn clone(&self) -> FnRow

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FnRow

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FnRow

Source§

fn default() -> FnRow

Returns the “default value” for a type. Read more
Source§

impl Eq for FnRow

Source§

impl Hash for FnRow

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for FnRow

Source§

fn cmp(&self, other: &FnRow) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 (const: unstable) · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable) · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

fn clamp_to<R>(self, range: R) -> Self
where Self: Sized, R: ClampBounds<Self>,

🔬This is a nightly-only experimental API. (clamp_to)
Restrict a value to a certain range. Read more
Source§

impl PartialEq for FnRow

Source§

fn eq(&self, other: &FnRow) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl PartialOrd for FnRow

Source§

fn partial_cmp(&self, other: &FnRow) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable) · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable) · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable) · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable) · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl StructuralPartialEq for FnRow

Auto Trait Implementations§

§

impl Freeze for FnRow

§

impl RefUnwindSafe for FnRow

§

impl Send for FnRow

§

impl Sync for FnRow

§

impl Unpin for FnRow

§

impl UnsafeUnpin for FnRow

§

impl UnwindSafe for FnRow

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Comparable<K> for Q
where Q: Ord + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more