Struct rustc_interface::util::ReplaceBodyWithLoop[−][src]

pub struct ReplaceBodyWithLoop<'a, 'b> {
    within_static_or_const: bool,
    nested_blocks: Option<Vec<Block>>,
    resolver: &'a mut Resolver<'b>,
}
Expand description

Replaces function bodies with loop {} (an infinite loop). This gets rid of all semantic errors in the body while still satisfying the return type, except in certain cases, see below for more.

This pass is known as everybody_loops. Very punny.

As of March 2021, everybody_loops is only used for the -Z unpretty=everybody_loops debugging option.

FIXME: Currently the everybody_loops transformation is not applied to:

  • const fn; support could be added, but hasn’t. Originally const fn was skipped due to issue #43636 that loop was not supported for const evaluation.
  • impl Trait, due to issue #43869 that functions returning impl Trait cannot be diverging. Solving this may require ! to implement every trait, which relies on the an even more ambitious form of the closed RFC #1637. See also #34511.

Fields

within_static_or_const: boolnested_blocks: Option<Vec<Block>>resolver: &'a mut Resolver<'b>

Implementations

impl<'a, 'b> ReplaceBodyWithLoop<'a, 'b>[src]

pub fn new(resolver: &'a mut Resolver<'b>) -> ReplaceBodyWithLoop<'a, 'b>[src]

fn run<R, F: FnOnce(&mut Self) -> R>(&mut self, is_const: bool, action: F) -> R[src]

fn should_ignore_fn(ret_ty: &FnRetTy) -> bool[src]

fn is_sig_const(sig: &FnSig) -> bool[src]

Trait Implementations

impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_>[src]

fn visit_item_kind(&mut self, i: &mut ItemKind)[src]

fn flat_map_trait_item(
    &mut self,
    i: P<AssocItem>
) -> SmallVec<[P<AssocItem>; 1]>
[src]

fn flat_map_impl_item(&mut self, i: P<AssocItem>) -> SmallVec<[P<AssocItem>; 1]>[src]

fn visit_anon_const(&mut self, c: &mut AnonConst)[src]

fn visit_block(&mut self, b: &mut P<Block>)[src]

fn token_visiting_enabled(&self) -> bool[src]

Mutable token visiting only exists for the macro_rules token marker and should not be used otherwise. Token visitor would be entirely separate from the regular visitor if the marker didn’t have to visit AST fragments in nonterminal tokens. Read more

fn visit_crate(&mut self, c: &mut Crate)[src]

fn visit_meta_list_item(&mut self, list_item: &mut NestedMetaItem)[src]

fn visit_meta_item(&mut self, meta_item: &mut MetaItem)[src]

fn visit_use_tree(&mut self, use_tree: &mut UseTree)[src]

fn flat_map_foreign_item(
    &mut self,
    ni: P<Item<ForeignItemKind>>
) -> SmallVec<[P<Item<ForeignItemKind>>; 1]>
[src]

fn flat_map_item(
    &mut self,
    i: P<Item<ItemKind>>
) -> SmallVec<[P<Item<ItemKind>>; 1]>
[src]

fn visit_fn_header(&mut self, header: &mut FnHeader)[src]

fn flat_map_field_def(&mut self, fd: FieldDef) -> SmallVec<[FieldDef; 1]>[src]

fn visit_fn_decl(&mut self, d: &mut P<FnDecl>)[src]

fn visit_asyncness(&mut self, a: &mut Async)[src]

fn flat_map_stmt(&mut self, s: Stmt) -> SmallVec<[Stmt; 1]>[src]

fn flat_map_arm(&mut self, arm: Arm) -> SmallVec<[Arm; 1]>[src]

fn visit_pat(&mut self, p: &mut P<Pat>)[src]

fn visit_expr(&mut self, e: &mut P<Expr>)[src]

fn filter_map_expr(&mut self, e: P<Expr>) -> Option<P<Expr>>[src]

fn visit_generic_arg(&mut self, arg: &mut GenericArg)[src]

fn visit_ty(&mut self, t: &mut P<Ty>)[src]

fn visit_lifetime(&mut self, l: &mut Lifetime)[src]

fn visit_ty_constraint(&mut self, t: &mut AssocTyConstraint)[src]

fn visit_foreign_mod(&mut self, nm: &mut ForeignMod)[src]

fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]>[src]

fn visit_ident(&mut self, i: &mut Ident)[src]

fn visit_path(&mut self, p: &mut Path)[src]

fn visit_qself(&mut self, qs: &mut Option<QSelf>)[src]

fn visit_generic_args(&mut self, p: &mut GenericArgs)[src]

fn visit_angle_bracketed_parameter_data(&mut self, p: &mut AngleBracketedArgs)[src]

fn visit_parenthesized_parameter_data(&mut self, p: &mut ParenthesizedArgs)[src]

fn visit_local(&mut self, l: &mut P<Local>)[src]

fn visit_mac_call(&mut self, mac: &mut MacCall)[src]

fn visit_macro_def(&mut self, def: &mut MacroDef)[src]

fn visit_label(&mut self, label: &mut Label)[src]

fn visit_attribute(&mut self, at: &mut Attribute)[src]

fn flat_map_param(&mut self, param: Param) -> SmallVec<[Param; 1]>[src]

fn visit_generics(&mut self, generics: &mut Generics)[src]

fn visit_trait_ref(&mut self, tr: &mut TraitRef)[src]

fn visit_poly_trait_ref(&mut self, p: &mut PolyTraitRef)[src]

fn visit_variant_data(&mut self, vdata: &mut VariantData)[src]

fn flat_map_generic_param(
    &mut self,
    param: GenericParam
) -> SmallVec<[GenericParam; 1]>
[src]

fn visit_param_bound(&mut self, tpb: &mut GenericBound)[src]

fn visit_mt(&mut self, mt: &mut MutTy)[src]

fn flat_map_expr_field(&mut self, f: ExprField) -> SmallVec<[ExprField; 1]>[src]

fn visit_where_clause(&mut self, where_clause: &mut WhereClause)[src]

fn visit_where_predicate(&mut self, where_predicate: &mut WherePredicate)[src]

fn visit_vis(&mut self, vis: &mut Visibility)[src]

fn visit_id(&mut self, _id: &mut NodeId)[src]

fn visit_span(&mut self, _sp: &mut Span)[src]

fn flat_map_pat_field(&mut self, fp: PatField) -> SmallVec<[PatField; 1]>[src]

Auto Trait Implementations

impl<'a, 'b> !RefUnwindSafe for ReplaceBodyWithLoop<'a, 'b>

impl<'a, 'b> !Send for ReplaceBodyWithLoop<'a, 'b>

impl<'a, 'b> !Sync for ReplaceBodyWithLoop<'a, 'b>

impl<'a, 'b> Unpin for ReplaceBodyWithLoop<'a, 'b> where
    'b: 'a, 

impl<'a, 'b> !UnwindSafe for ReplaceBodyWithLoop<'a, 'b>

Blanket Implementations

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

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized, 
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized, 
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

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

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

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

Performs the conversion.