Skip to main content

LintState

Struct LintState 

Source
struct LintState<'tcx> {
    tcx: TyCtxt<'tcx>,
    item: LocalDefId,
    annotation: Option<Span>,
    shown_item: bool,
    shown_lints: FxHashSet<DefId>,
}

Fields§

§tcx: TyCtxt<'tcx>§item: LocalDefId

The item we are currently linting.

§annotation: Option<Span>

For diagnostics; used to point to the #[ferrocene::prevalidated] attribute.

§shown_item: bool

For diagnostics; see lint_use.

§shown_lints: FxHashSet<DefId>

For deduplication; see check_use.

Implementations§

Source§

impl<'tcx> LintState<'tcx>

Diagnostics.

Source

fn func_span(&self, def_id: DefId) -> Span

Source

pub(super) fn lint_use(&mut self, lint_node: HirId, use_: Use<'tcx>)

Source

fn decorate_cast(&self, use_: Use<'tcx>, diag: &mut Diag<'_, ()>)

Source

fn decorate_instantiation( &self, use_: Use<'tcx>, diag: &mut Diag<'_, ()>, validated_span: Option<&mut MultiSpan>, )

Source§

impl<'tcx> LintState<'tcx>

Source

pub(super) fn check_fn_ptr_coercion( &self, source: Ty<'tcx>, dst_trait: PolyTraitRef<'tcx>, try_instantiate: &mut impl FnMut(DefId, GenericArgsRef<'tcx>) -> InstantiateResult<'tcx>, span: Span, ) -> Option<UseKind<'tcx>>

Source

pub(super) fn check_dyn_trait_coercion( &self, dest_ty: Ty<'tcx>, source_ty: Ty<'tcx>, typing_env: TypingEnv<'tcx>, try_instantiate: &mut impl FnMut(DefId, GenericArgsRef<'tcx>) -> InstantiateResult<'tcx>, span: Span, ) -> Option<UseKind<'tcx>>

Given a source expression that has an unsizing cast to dest, determine whether the cast is valid. If not, return a TraitObjectCast showing why not.

This works in four main parts:

  1. “Peel” as many types as possible. For example, if we are casting Vec<Box<String>> to Vec<Box<dyn Display + Clone + Sync>, peel that to String and dyn Display + Clone + Sync. We call these coerce_src and coerce_dst.
  2. Determine all traits in dest’s type that have at least one method. For example, dyn Display + Clone + Sync contains the traits Display and Clone.
  3. For each trait, find coerce_src’s implementation of it. For example, impl Display for String.
  4. For each method in the impl, check whether it’s validated. For example, we would check <String as Diplay>::fmt, see that it’s unvalidated, and return its DefId in the UseKind.
Source

pub(super) fn instance_of_ty( &self, ty: Ty<'tcx>, fn_trait_ref: Option<PolyTraitRef<'tcx>>, try_instantiate: &mut impl FnMut(DefId, GenericArgsRef<'tcx>) -> InstantiateResult<'tcx>, span: Span, ) -> Option<Instance<'tcx>>

Given a call to a function-like type, return the instantiated function definition, or None if we can’t find it until it’s been monomorphized.

Panics if given a type that isn’t callable.

Source

fn peel_unsized_tys( &self, src_ty: Ty<'tcx>, dst_ty: Ty<'tcx>, typing_env: TypingEnv<'tcx>, span: Span, ) -> Option<(Ty<'tcx>, Ty<'tcx>)>

Given an Unsize coersion from src_ty to dst_ty, return the innermost “difference” between the two. Returns None if this isn’t a cast to a trait object.

This is quite similar to struct_lockstep_tails_for_codegen, except it considers all ZSTs, not just those at the tail.

c.f. Zulip

See CoerceUnsized for a full list of types we need to handle here.

This is adapted from rustc_monomorphize::collector::find_tails_for_unsizing.

Source

fn custom_coerce_unsize_info( &self, source_ty: Ty<'tcx>, target_ty: Ty<'tcx>, span: Span, ) -> Option<CustomCoerceUnsized>

Source

fn find_unvalidated_impl_fn(&self, impl_block: DefId) -> Option<DefId>

Given an impl, find the first associated function that isn’t validated.

FIXME: list all unvalidated functions, not just the first.

Source

fn find_trait_impl( &self, trait_ref: PolyTraitRef<'tcx>, typing_env: TypingEnv<'tcx>, span: Span, ) -> ImplSource<'tcx, Span>

Source

fn try_find_trait_impl( &self, trait_ref: PolyTraitRef<'tcx>, typing_env: TypingEnv<'tcx>, span: Span, ) -> Option<ImplSource<'tcx, Span>>

Given a Trait<Ty> reference, find impl Trait for Ty.

This calls into the trait solver to select a suitable impl block.

c.f. hax::exporter::traits::resolution::shallow_resolve_trait_ref

Ideally, this would never return None, but sometimes our code is buggy … failures here only degrade the diagnostic, they don’t cause soundness issues.

Source

fn dyn_trait_refs( &self, source_ty: Ty<'tcx>, dst_ty: Ty<'tcx>, ) -> Vec<Binder<'tcx, TraitRef<'tcx>>>

Given a Rust type, find (at any level of nesting) dyn Trait objects contained within it that have at least one method. For example, dyn Send + Sync + Display + Clone would return [Display, Clone].

Source§

impl<'tcx> LintState<'tcx>

Source

fn new(tcx: TyCtxt<'tcx>, item: LocalDefId) -> Option<Self>

Check whether item needs to be linted at all. If so, return a new LintState.

Source

fn check_use(&mut self, lint_node: HirId, use_: Use<'tcx>)

Check whether an item use needs to be linted. If so, lint it.

Auto Trait Implementations§

§

impl<'tcx> !RefUnwindSafe for LintState<'tcx>

§

impl<'tcx> !Send for LintState<'tcx>

§

impl<'tcx> !Sync for LintState<'tcx>

§

impl<'tcx> !UnwindSafe for LintState<'tcx>

§

impl<'tcx> DynSend for LintState<'tcx>

§

impl<'tcx> DynSync for LintState<'tcx>

§

impl<'tcx> Freeze for LintState<'tcx>

§

impl<'tcx> Unpin for LintState<'tcx>

§

impl<'tcx> UnsafeUnpin for LintState<'tcx>

Blanket Implementations§

Source§

impl<T> Aligned for T

Source§

const ALIGN: Alignment

Alignment of Self.
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, R> CollectAndApply<T, R> for T

Source§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

Source§

type Output = R

Source§

impl<T> ErasedDestructor for T
where T: 'static,

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<K> IntoQueryKey<K> for K

Source§

fn into_query_key(self) -> K

Argument conversion from Self to K. This should always be a very cheap conversion, e.g. LocalDefId::to_def_id.
Source§

impl<T> MaybeResult<T> for T

Source§

type Error = !

Source§

fn from(_: Result<T, <T as MaybeResult<T>>::Error>) -> T

Source§

fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

Source§

fn upcast(self, interner: I) -> U

Source§

impl<I, T> UpcastFrom<I, T> for T

Source§

fn upcast_from(from: T, _tcx: I) -> T

Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 64 bytes