Auto merge of #101086 - cjgillot:thir-param, r=oli-obk
Compute information about function parameters on THIR This avoids some manipulation of typeck results while building MIR.
This commit is contained in:
commit
c84083b08e
70 changed files with 682 additions and 917 deletions
|
@ -360,7 +360,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
|
||||
diag.span_label(upvar_span, "captured outer variable");
|
||||
diag.span_label(
|
||||
self.body.span,
|
||||
self.infcx.tcx.def_span(def_id),
|
||||
format!("captured by this `{closure_kind}` closure"),
|
||||
);
|
||||
|
||||
|
|
|
@ -9,10 +9,7 @@ use rustc_middle::mir::{Mutability, Place, PlaceRef, ProjectionElem};
|
|||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_middle::{
|
||||
hir::place::PlaceBase,
|
||||
mir::{
|
||||
self, BindingForm, ClearCrossCrate, ImplicitSelfKind, Local, LocalDecl, LocalInfo,
|
||||
LocalKind, Location,
|
||||
},
|
||||
mir::{self, BindingForm, ClearCrossCrate, Local, LocalDecl, LocalInfo, LocalKind, Location},
|
||||
};
|
||||
use rustc_span::source_map::DesugaringKind;
|
||||
use rustc_span::symbol::{kw, Symbol};
|
||||
|
@ -312,7 +309,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
&& !matches!(
|
||||
decl.local_info,
|
||||
Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf(
|
||||
ImplicitSelfKind::MutRef
|
||||
hir::ImplicitSelfKind::MutRef
|
||||
))))
|
||||
)
|
||||
{
|
||||
|
@ -973,6 +970,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
|
||||
let hir = self.infcx.tcx.hir();
|
||||
let closure_id = self.mir_hir_id();
|
||||
let closure_span = self.infcx.tcx.def_span(self.mir_def_id());
|
||||
let fn_call_id = hir.get_parent_node(closure_id);
|
||||
let node = hir.get(fn_call_id);
|
||||
let def_id = hir.enclosing_body_owner(fn_call_id);
|
||||
|
@ -1024,7 +1022,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
if let Some(span) = arg {
|
||||
err.span_label(span, "change this to accept `FnMut` instead of `Fn`");
|
||||
err.span_label(func.span, "expects `Fn` instead of `FnMut`");
|
||||
err.span_label(self.body.span, "in this closure");
|
||||
err.span_label(closure_span, "in this closure");
|
||||
look_at_return = false;
|
||||
}
|
||||
}
|
||||
|
@ -1050,7 +1048,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
sig.decl.output.span(),
|
||||
"change this to return `FnMut` instead of `Fn`",
|
||||
);
|
||||
err.span_label(self.body.span, "in this closure");
|
||||
err.span_label(closure_span, "in this closure");
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
@ -1074,7 +1072,7 @@ fn mut_borrow_of_mutable_ref(local_decl: &LocalDecl<'_>, local_name: Option<Symb
|
|||
//
|
||||
// Deliberately fall into this case for all implicit self types,
|
||||
// so that we don't fall in to the next case with them.
|
||||
*kind == mir::ImplicitSelfKind::MutRef
|
||||
*kind == hir::ImplicitSelfKind::MutRef
|
||||
}
|
||||
_ if Some(kw::SelfLower) == local_name => {
|
||||
// Otherwise, check if the name is the `self` keyword - in which case
|
||||
|
|
|
@ -389,8 +389,9 @@ pub(super) fn dump_annotation<'a, 'tcx>(
|
|||
// viewing the intraprocedural state, the -Zdump-mir output is
|
||||
// better.
|
||||
|
||||
let def_span = tcx.def_span(body.source.def_id());
|
||||
let mut err = if let Some(closure_region_requirements) = closure_region_requirements {
|
||||
let mut err = tcx.sess.diagnostic().span_note_diag(body.span, "external requirements");
|
||||
let mut err = tcx.sess.diagnostic().span_note_diag(def_span, "external requirements");
|
||||
|
||||
regioncx.annotate(tcx, &mut err);
|
||||
|
||||
|
@ -409,7 +410,7 @@ pub(super) fn dump_annotation<'a, 'tcx>(
|
|||
|
||||
err
|
||||
} else {
|
||||
let mut err = tcx.sess.diagnostic().span_note_diag(body.span, "no external requirements");
|
||||
let mut err = tcx.sess.diagnostic().span_note_diag(def_span, "no external requirements");
|
||||
regioncx.annotate(tcx, &mut err);
|
||||
|
||||
err
|
||||
|
|
|
@ -2661,7 +2661,7 @@ pub struct FnDecl<'hir> {
|
|||
}
|
||||
|
||||
/// Represents what type of implicit self a function has, if any.
|
||||
#[derive(Copy, Clone, Encodable, Decodable, Debug, HashStable_Generic)]
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Encodable, Decodable, Debug, HashStable_Generic)]
|
||||
pub enum ImplicitSelfKind {
|
||||
/// Represents a `fn x(self);`.
|
||||
Imm,
|
||||
|
|
|
@ -18,7 +18,7 @@ use rustc_data_structures::captures::Captures;
|
|||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir::def::{CtorKind, Namespace};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID};
|
||||
use rustc_hir::{self, GeneratorKind};
|
||||
use rustc_hir::{self, GeneratorKind, ImplicitSelfKind};
|
||||
use rustc_hir::{self as hir, HirId};
|
||||
use rustc_session::Session;
|
||||
use rustc_target::abi::{Size, VariantIdx};
|
||||
|
@ -653,22 +653,6 @@ pub enum BindingForm<'tcx> {
|
|||
RefForGuard,
|
||||
}
|
||||
|
||||
/// Represents what type of implicit self a function has, if any.
|
||||
#[derive(Clone, Copy, PartialEq, Debug, TyEncodable, TyDecodable, HashStable)]
|
||||
pub enum ImplicitSelfKind {
|
||||
/// Represents a `fn x(self);`.
|
||||
Imm,
|
||||
/// Represents a `fn x(mut self);`.
|
||||
Mut,
|
||||
/// Represents a `fn x(&self);`.
|
||||
ImmRef,
|
||||
/// Represents a `fn x(&mut self);`.
|
||||
MutRef,
|
||||
/// Represents when a function does not have a self argument or
|
||||
/// when a function has a `self: X` argument.
|
||||
None,
|
||||
}
|
||||
|
||||
TrivialTypeTraversalAndLiftImpls! { BindingForm<'tcx>, }
|
||||
|
||||
mod binding_form_impl {
|
||||
|
|
|
@ -73,11 +73,29 @@ macro_rules! thir_with_elements {
|
|||
}
|
||||
}
|
||||
|
||||
pub const UPVAR_ENV_PARAM: ParamId = ParamId::from_u32(0);
|
||||
|
||||
thir_with_elements! {
|
||||
arms: ArmId => Arm<'tcx> => "a{}",
|
||||
blocks: BlockId => Block => "b{}",
|
||||
exprs: ExprId => Expr<'tcx> => "e{}",
|
||||
stmts: StmtId => Stmt<'tcx> => "s{}",
|
||||
params: ParamId => Param<'tcx> => "p{}",
|
||||
}
|
||||
|
||||
/// Description of a type-checked function parameter.
|
||||
#[derive(Clone, Debug, HashStable)]
|
||||
pub struct Param<'tcx> {
|
||||
/// The pattern that appears in the parameter list, or None for implicit parameters.
|
||||
pub pat: Option<Box<Pat<'tcx>>>,
|
||||
/// The possibly inferred type.
|
||||
pub ty: Ty<'tcx>,
|
||||
/// Span of the explicitly provided type, or None if inferred for closures.
|
||||
pub ty_span: Option<Span>,
|
||||
/// Whether this param is `self`, and how it is bound.
|
||||
pub self_kind: Option<hir::ImplicitSelfKind>,
|
||||
/// HirId for lints.
|
||||
pub hir_id: Option<hir::HirId>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, HashStable)]
|
||||
|
@ -548,6 +566,15 @@ impl<'tcx> Pat<'tcx> {
|
|||
pub fn wildcard_from_ty(ty: Ty<'tcx>) -> Self {
|
||||
Pat { ty, span: DUMMY_SP, kind: PatKind::Wild }
|
||||
}
|
||||
|
||||
pub fn simple_ident(&self) -> Option<Symbol> {
|
||||
match self.kind {
|
||||
PatKind::Binding { name, mode: BindingMode::ByValue, subpattern: None, .. } => {
|
||||
Some(name)
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, HashStable)]
|
||||
|
|
|
@ -568,7 +568,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
|
||||
_ => {
|
||||
let place_builder = unpack!(block = self.as_place_builder(block, initializer));
|
||||
self.place_into_pattern(block, irrefutable_pat, place_builder, true)
|
||||
self.place_into_pattern(block, &irrefutable_pat, place_builder, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +1,14 @@
|
|||
use crate::build;
|
||||
pub(crate) use crate::build::expr::as_constant::lit_to_mir_constant;
|
||||
use crate::build::expr::as_place::PlaceBuilder;
|
||||
use crate::build::scope::DropKind;
|
||||
use crate::thir::pattern::pat_from_hir;
|
||||
use rustc_apfloat::ieee::{Double, Single};
|
||||
use rustc_apfloat::Float;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::sorted_map::SortedIndexMultiMap;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir::{GeneratorKind, Node};
|
||||
use rustc_index::vec::{Idx, IndexVec};
|
||||
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
|
||||
|
@ -19,8 +17,9 @@ use rustc_middle::middle::region;
|
|||
use rustc_middle::mir::interpret::ConstValue;
|
||||
use rustc_middle::mir::interpret::Scalar;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::thir::{BindingMode, Expr, ExprId, LintLevel, LocalVarId, PatKind, Thir};
|
||||
use rustc_middle::ty::subst::Subst;
|
||||
use rustc_middle::thir::{
|
||||
self, BindingMode, Expr, ExprId, LintLevel, LocalVarId, Param, ParamId, PatKind, Thir,
|
||||
};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitable, TypeckResults};
|
||||
use rustc_span::symbol::sym;
|
||||
use rustc_span::Span;
|
||||
|
@ -48,9 +47,7 @@ pub(crate) fn mir_built<'tcx>(
|
|||
|
||||
/// Construct the MIR for a given `DefId`.
|
||||
fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_> {
|
||||
let id = tcx.hir().local_def_id_to_hir_id(def.did);
|
||||
let body_owner_kind = tcx.hir().body_owner_kind(def.did);
|
||||
let typeck_results = tcx.typeck_opt_const_arg(def);
|
||||
|
||||
// Ensure unsafeck and abstract const building is ran before we steal the THIR.
|
||||
// We can't use `ensure()` for `thir_abstract_const` as it doesn't compute the query
|
||||
|
@ -67,202 +64,19 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_
|
|||
}
|
||||
}
|
||||
|
||||
// Figure out what primary body this item has.
|
||||
let (body_id, return_ty_span, span_with_body) = match tcx.hir().get(id) {
|
||||
Node::Expr(hir::Expr {
|
||||
kind: hir::ExprKind::Closure(hir::Closure { fn_decl, body, .. }),
|
||||
..
|
||||
}) => (*body, fn_decl.output.span(), None),
|
||||
Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Fn(hir::FnSig { decl, .. }, _, body_id),
|
||||
span,
|
||||
..
|
||||
})
|
||||
| Node::ImplItem(hir::ImplItem {
|
||||
kind: hir::ImplItemKind::Fn(hir::FnSig { decl, .. }, body_id),
|
||||
span,
|
||||
..
|
||||
})
|
||||
| Node::TraitItem(hir::TraitItem {
|
||||
kind: hir::TraitItemKind::Fn(hir::FnSig { decl, .. }, hir::TraitFn::Provided(body_id)),
|
||||
span,
|
||||
..
|
||||
}) => {
|
||||
// Use the `Span` of the `Item/ImplItem/TraitItem` as the body span,
|
||||
// since the def span of a function does not include the body
|
||||
(*body_id, decl.output.span(), Some(*span))
|
||||
}
|
||||
Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Static(ty, _, body_id) | hir::ItemKind::Const(ty, body_id),
|
||||
..
|
||||
})
|
||||
| Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Const(ty, body_id), .. })
|
||||
| Node::TraitItem(hir::TraitItem {
|
||||
kind: hir::TraitItemKind::Const(ty, Some(body_id)),
|
||||
..
|
||||
}) => (*body_id, ty.span, None),
|
||||
Node::AnonConst(hir::AnonConst { body, hir_id, .. }) => {
|
||||
(*body, tcx.hir().span(*hir_id), None)
|
||||
}
|
||||
|
||||
_ => span_bug!(tcx.hir().span(id), "can't build MIR for {:?}", def.did),
|
||||
};
|
||||
|
||||
// If we don't have a specialized span for the body, just use the
|
||||
// normal def span.
|
||||
let span_with_body = span_with_body.unwrap_or_else(|| tcx.hir().span(id));
|
||||
|
||||
tcx.infer_ctxt().enter(|infcx| {
|
||||
let body = if let Some(error_reported) = typeck_results.tainted_by_errors {
|
||||
build::construct_error(&infcx, def, id, body_id, body_owner_kind, error_reported)
|
||||
} else if body_owner_kind.is_fn_or_closure() {
|
||||
// fetch the fully liberated fn signature (that is, all bound
|
||||
// types/lifetimes replaced)
|
||||
let fn_sig = typeck_results.liberated_fn_sigs()[id];
|
||||
let fn_def_id = tcx.hir().local_def_id(id);
|
||||
|
||||
let safety = match fn_sig.unsafety {
|
||||
hir::Unsafety::Normal => Safety::Safe,
|
||||
hir::Unsafety::Unsafe => Safety::FnUnsafe,
|
||||
};
|
||||
|
||||
let body = tcx.hir().body(body_id);
|
||||
let (thir, expr) = tcx
|
||||
.thir_body(def)
|
||||
.unwrap_or_else(|_| (tcx.alloc_steal_thir(Thir::new()), ExprId::from_u32(0)));
|
||||
// We ran all queries that depended on THIR at the beginning
|
||||
// of `mir_build`, so now we can steal it
|
||||
let thir = thir.steal();
|
||||
let ty = tcx.type_of(fn_def_id);
|
||||
let mut abi = fn_sig.abi;
|
||||
let implicit_argument = match ty.kind() {
|
||||
ty::Closure(..) => {
|
||||
// HACK(eddyb) Avoid having RustCall on closures,
|
||||
// as it adds unnecessary (and wrong) auto-tupling.
|
||||
abi = Abi::Rust;
|
||||
vec![ArgInfo(liberated_closure_env_ty(tcx, id, body_id), None, None, None)]
|
||||
}
|
||||
ty::Generator(..) => {
|
||||
let gen_ty = tcx.typeck_body(body_id).node_type(id);
|
||||
|
||||
// The resume argument may be missing, in that case we need to provide it here.
|
||||
// It will always be `()` in this case.
|
||||
if body.params.is_empty() {
|
||||
vec![
|
||||
ArgInfo(gen_ty, None, None, None),
|
||||
ArgInfo(tcx.mk_unit(), None, None, None),
|
||||
]
|
||||
} else {
|
||||
vec![ArgInfo(gen_ty, None, None, None)]
|
||||
}
|
||||
}
|
||||
_ => vec![],
|
||||
};
|
||||
|
||||
let explicit_arguments = body.params.iter().enumerate().map(|(index, arg)| {
|
||||
let owner_id = tcx.hir().body_owner(body_id);
|
||||
let opt_ty_info;
|
||||
let self_arg;
|
||||
if let Some(ref fn_decl) = tcx.hir().fn_decl_by_hir_id(owner_id) {
|
||||
opt_ty_info = fn_decl
|
||||
.inputs
|
||||
.get(index)
|
||||
// Make sure that inferred closure args have no type span
|
||||
.and_then(|ty| if arg.pat.span != ty.span { Some(ty.span) } else { None });
|
||||
self_arg = if index == 0 && fn_decl.implicit_self.has_implicit_self() {
|
||||
match fn_decl.implicit_self {
|
||||
hir::ImplicitSelfKind::Imm => Some(ImplicitSelfKind::Imm),
|
||||
hir::ImplicitSelfKind::Mut => Some(ImplicitSelfKind::Mut),
|
||||
hir::ImplicitSelfKind::ImmRef => Some(ImplicitSelfKind::ImmRef),
|
||||
hir::ImplicitSelfKind::MutRef => Some(ImplicitSelfKind::MutRef),
|
||||
_ => None,
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
} else {
|
||||
opt_ty_info = None;
|
||||
self_arg = None;
|
||||
}
|
||||
|
||||
// C-variadic fns also have a `VaList` input that's not listed in `fn_sig`
|
||||
// (as it's created inside the body itself, not passed in from outside).
|
||||
let ty = if fn_sig.c_variadic && index == fn_sig.inputs().len() {
|
||||
let va_list_did = tcx.require_lang_item(LangItem::VaList, Some(arg.span));
|
||||
|
||||
tcx.bound_type_of(va_list_did).subst(tcx, &[tcx.lifetimes.re_erased.into()])
|
||||
} else {
|
||||
fn_sig.inputs()[index]
|
||||
};
|
||||
|
||||
ArgInfo(ty, opt_ty_info, Some(&arg), self_arg)
|
||||
});
|
||||
|
||||
let arguments = implicit_argument.into_iter().chain(explicit_arguments);
|
||||
|
||||
let (yield_ty, return_ty) = if body.generator_kind.is_some() {
|
||||
let gen_ty = tcx.typeck_body(body_id).node_type(id);
|
||||
let gen_sig = match gen_ty.kind() {
|
||||
ty::Generator(_, gen_substs, ..) => gen_substs.as_generator().sig(),
|
||||
_ => span_bug!(tcx.hir().span(id), "generator w/o generator type: {:?}", ty),
|
||||
};
|
||||
(Some(gen_sig.yield_ty), gen_sig.return_ty)
|
||||
} else {
|
||||
(None, fn_sig.output())
|
||||
};
|
||||
|
||||
let mut mir = build::construct_fn(
|
||||
&thir,
|
||||
&infcx,
|
||||
def,
|
||||
id,
|
||||
arguments,
|
||||
safety,
|
||||
abi,
|
||||
return_ty,
|
||||
return_ty_span,
|
||||
body,
|
||||
expr,
|
||||
span_with_body,
|
||||
);
|
||||
if yield_ty.is_some() {
|
||||
mir.generator.as_mut().unwrap().yield_ty = yield_ty;
|
||||
}
|
||||
mir
|
||||
} else {
|
||||
// Get the revealed type of this const. This is *not* the adjusted
|
||||
// type of its body, which may be a subtype of this type. For
|
||||
// example:
|
||||
//
|
||||
// fn foo(_: &()) {}
|
||||
// static X: fn(&'static ()) = foo;
|
||||
//
|
||||
// The adjusted type of the body of X is `for<'a> fn(&'a ())` which
|
||||
// is not the same as the type of X. We need the type of the return
|
||||
// place to be the type of the constant because NLL typeck will
|
||||
// equate them.
|
||||
|
||||
let return_ty = typeck_results.node_type(id);
|
||||
|
||||
let (thir, expr) = tcx
|
||||
.thir_body(def)
|
||||
.unwrap_or_else(|_| (tcx.alloc_steal_thir(Thir::new()), ExprId::from_u32(0)));
|
||||
let body = match tcx.thir_body(def) {
|
||||
Err(error_reported) => construct_error(tcx, def.did, body_owner_kind, error_reported),
|
||||
Ok((thir, expr)) => {
|
||||
// We ran all queries that depended on THIR at the beginning
|
||||
// of `mir_build`, so now we can steal it
|
||||
let thir = thir.steal();
|
||||
|
||||
let span_with_body = span_with_body.to(tcx.hir().span(body_id.hir_id));
|
||||
|
||||
build::construct_const(
|
||||
&thir,
|
||||
&infcx,
|
||||
expr,
|
||||
def,
|
||||
id,
|
||||
return_ty,
|
||||
return_ty_span,
|
||||
span_with_body,
|
||||
)
|
||||
if body_owner_kind.is_fn_or_closure() {
|
||||
construct_fn(tcx, def, &thir, expr)
|
||||
} else {
|
||||
construct_const(tcx, def, &thir, expr)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
lints::check(tcx, &body);
|
||||
|
@ -281,32 +95,11 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_
|
|||
);
|
||||
|
||||
body
|
||||
})
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// BuildMir -- walks a crate, looking for fn items and methods to build MIR from
|
||||
|
||||
fn liberated_closure_env_ty(
|
||||
tcx: TyCtxt<'_>,
|
||||
closure_expr_id: hir::HirId,
|
||||
body_id: hir::BodyId,
|
||||
) -> Ty<'_> {
|
||||
let closure_ty = tcx.typeck_body(body_id).node_type(closure_expr_id);
|
||||
|
||||
let ty::Closure(closure_def_id, closure_substs) = *closure_ty.kind() else {
|
||||
bug!("closure expr does not have closure type: {:?}", closure_ty);
|
||||
};
|
||||
|
||||
let bound_vars =
|
||||
tcx.mk_bound_variable_kinds(std::iter::once(ty::BoundVariableKind::Region(ty::BrEnv)));
|
||||
let br =
|
||||
ty::BoundRegion { var: ty::BoundVar::from_usize(bound_vars.len() - 1), kind: ty::BrEnv };
|
||||
let env_region = ty::ReLateBound(ty::INNERMOST, br);
|
||||
let closure_env_ty = tcx.closure_env_ty(closure_def_id, closure_substs, env_region).unwrap();
|
||||
tcx.erase_late_bound_regions(ty::Binder::bind_with_vars(closure_env_ty, bound_vars))
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
enum BlockFrame {
|
||||
/// Evaluation is currently within a statement.
|
||||
|
@ -364,7 +157,7 @@ struct BlockContext(Vec<BlockFrame>);
|
|||
|
||||
struct Builder<'a, 'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
infcx: InferCtxt<'a, 'tcx>,
|
||||
typeck_results: &'tcx TypeckResults<'tcx>,
|
||||
region_scope_tree: &'tcx region::ScopeTree,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
|
@ -636,35 +429,59 @@ macro_rules! unpack {
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
/// the main entry point for building MIR for a function
|
||||
|
||||
struct ArgInfo<'tcx>(
|
||||
Ty<'tcx>,
|
||||
Option<Span>,
|
||||
Option<&'tcx hir::Param<'tcx>>,
|
||||
Option<ImplicitSelfKind>,
|
||||
);
|
||||
|
||||
fn construct_fn<'tcx, A>(
|
||||
thir: &Thir<'tcx>,
|
||||
infcx: &InferCtxt<'_, 'tcx>,
|
||||
fn construct_fn<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
fn_def: ty::WithOptConstParam<LocalDefId>,
|
||||
fn_id: hir::HirId,
|
||||
arguments: A,
|
||||
safety: Safety,
|
||||
abi: Abi,
|
||||
return_ty: Ty<'tcx>,
|
||||
return_ty_span: Span,
|
||||
body: &'tcx hir::Body<'tcx>,
|
||||
thir: &Thir<'tcx>,
|
||||
expr: ExprId,
|
||||
span_with_body: Span,
|
||||
) -> Body<'tcx>
|
||||
where
|
||||
A: Iterator<Item = ArgInfo<'tcx>>,
|
||||
{
|
||||
let arguments: Vec<_> = arguments.collect();
|
||||
) -> Body<'tcx> {
|
||||
let span = tcx.def_span(fn_def.did);
|
||||
let fn_id = tcx.hir().local_def_id_to_hir_id(fn_def.did);
|
||||
let generator_kind = tcx.generator_kind(fn_def.did);
|
||||
|
||||
let tcx = infcx.tcx;
|
||||
let span = tcx.hir().span(fn_id);
|
||||
// Figure out what primary body this item has.
|
||||
let body_id = tcx.hir().body_owned_by(fn_def.did);
|
||||
let span_with_body = tcx.hir().span_with_body(fn_id);
|
||||
let return_ty_span = tcx
|
||||
.hir()
|
||||
.fn_decl_by_hir_id(fn_id)
|
||||
.unwrap_or_else(|| span_bug!(span, "can't build MIR for {:?}", fn_def.did))
|
||||
.output
|
||||
.span();
|
||||
|
||||
// fetch the fully liberated fn signature (that is, all bound
|
||||
// types/lifetimes replaced)
|
||||
let typeck_results = tcx.typeck_opt_const_arg(fn_def);
|
||||
let fn_sig = typeck_results.liberated_fn_sigs()[fn_id];
|
||||
|
||||
let safety = match fn_sig.unsafety {
|
||||
hir::Unsafety::Normal => Safety::Safe,
|
||||
hir::Unsafety::Unsafe => Safety::FnUnsafe,
|
||||
};
|
||||
|
||||
let mut abi = fn_sig.abi;
|
||||
if let DefKind::Closure = tcx.def_kind(fn_def.did) {
|
||||
// HACK(eddyb) Avoid having RustCall on closures,
|
||||
// as it adds unnecessary (and wrong) auto-tupling.
|
||||
abi = Abi::Rust;
|
||||
}
|
||||
|
||||
let arguments = &thir.params;
|
||||
|
||||
let (yield_ty, return_ty) = if generator_kind.is_some() {
|
||||
let gen_ty = arguments[thir::UPVAR_ENV_PARAM].ty;
|
||||
let gen_sig = match gen_ty.kind() {
|
||||
ty::Generator(_, gen_substs, ..) => gen_substs.as_generator().sig(),
|
||||
_ => {
|
||||
span_bug!(span, "generator w/o generator type: {:?}", gen_ty)
|
||||
}
|
||||
};
|
||||
(Some(gen_sig.yield_ty), gen_sig.return_ty)
|
||||
} else {
|
||||
(None, fn_sig.output())
|
||||
};
|
||||
|
||||
let mut body = tcx.infer_ctxt().enter(|infcx| {
|
||||
let mut builder = Builder::new(
|
||||
thir,
|
||||
infcx,
|
||||
|
@ -675,59 +492,99 @@ where
|
|||
safety,
|
||||
return_ty,
|
||||
return_ty_span,
|
||||
body.generator_kind,
|
||||
generator_kind,
|
||||
);
|
||||
|
||||
let call_site_scope =
|
||||
region::Scope { id: body.value.hir_id.local_id, data: region::ScopeData::CallSite };
|
||||
region::Scope { id: body_id.hir_id.local_id, data: region::ScopeData::CallSite };
|
||||
let arg_scope =
|
||||
region::Scope { id: body.value.hir_id.local_id, data: region::ScopeData::Arguments };
|
||||
region::Scope { id: body_id.hir_id.local_id, data: region::ScopeData::Arguments };
|
||||
let source_info = builder.source_info(span);
|
||||
let call_site_s = (call_site_scope, source_info);
|
||||
unpack!(builder.in_scope(call_site_s, LintLevel::Inherited, |builder| {
|
||||
let arg_scope_s = (arg_scope, source_info);
|
||||
// Attribute epilogue to function's closing brace
|
||||
let fn_end = span_with_body.shrink_to_hi();
|
||||
let return_block =
|
||||
unpack!(builder.in_breakable_scope(None, Place::return_place(), fn_end, |builder| {
|
||||
let return_block = unpack!(builder.in_breakable_scope(
|
||||
None,
|
||||
Place::return_place(),
|
||||
fn_end,
|
||||
|builder| {
|
||||
Some(builder.in_scope(arg_scope_s, LintLevel::Inherited, |builder| {
|
||||
builder.args_and_body(
|
||||
START_BLOCK,
|
||||
fn_def.did,
|
||||
&arguments,
|
||||
arguments,
|
||||
arg_scope,
|
||||
&thir[expr],
|
||||
)
|
||||
}))
|
||||
}));
|
||||
}
|
||||
));
|
||||
let source_info = builder.source_info(fn_end);
|
||||
builder.cfg.terminate(return_block, source_info, TerminatorKind::Return);
|
||||
builder.build_drop_trees();
|
||||
return_block.unit()
|
||||
}));
|
||||
|
||||
let spread_arg = if abi == Abi::RustCall {
|
||||
builder.finish()
|
||||
});
|
||||
|
||||
body.spread_arg = if abi == Abi::RustCall {
|
||||
// RustCall pseudo-ABI untuples the last argument.
|
||||
Some(Local::new(arguments.len()))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let mut body = builder.finish();
|
||||
body.spread_arg = spread_arg;
|
||||
if yield_ty.is_some() {
|
||||
body.generator.as_mut().unwrap().yield_ty = yield_ty;
|
||||
}
|
||||
body
|
||||
}
|
||||
|
||||
fn construct_const<'a, 'tcx>(
|
||||
thir: &'a Thir<'tcx>,
|
||||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
expr: ExprId,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def: ty::WithOptConstParam<LocalDefId>,
|
||||
hir_id: hir::HirId,
|
||||
const_ty: Ty<'tcx>,
|
||||
const_ty_span: Span,
|
||||
span: Span,
|
||||
thir: &'a Thir<'tcx>,
|
||||
expr: ExprId,
|
||||
) -> Body<'tcx> {
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def.did);
|
||||
|
||||
// Figure out what primary body this item has.
|
||||
let (span, const_ty_span) = match tcx.hir().get(hir_id) {
|
||||
Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Static(ty, _, _) | hir::ItemKind::Const(ty, _),
|
||||
span,
|
||||
..
|
||||
})
|
||||
| Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Const(ty, _), span, .. })
|
||||
| Node::TraitItem(hir::TraitItem {
|
||||
kind: hir::TraitItemKind::Const(ty, Some(_)),
|
||||
span,
|
||||
..
|
||||
}) => (*span, ty.span),
|
||||
Node::AnonConst(_) => {
|
||||
let span = tcx.def_span(def.did);
|
||||
(span, span)
|
||||
}
|
||||
_ => span_bug!(tcx.def_span(def.did), "can't build MIR for {:?}", def.did),
|
||||
};
|
||||
|
||||
// Get the revealed type of this const. This is *not* the adjusted
|
||||
// type of its body, which may be a subtype of this type. For
|
||||
// example:
|
||||
//
|
||||
// fn foo(_: &()) {}
|
||||
// static X: fn(&'static ()) = foo;
|
||||
//
|
||||
// The adjusted type of the body of X is `for<'a> fn(&'a ())` which
|
||||
// is not the same as the type of X. We need the type of the return
|
||||
// place to be the type of the constant because NLL typeck will
|
||||
// equate them.
|
||||
let typeck_results = tcx.typeck_opt_const_arg(def);
|
||||
let const_ty = typeck_results.node_type(hir_id);
|
||||
|
||||
tcx.infer_ctxt().enter(|infcx| {
|
||||
let mut builder = Builder::new(
|
||||
thir,
|
||||
infcx,
|
||||
|
@ -750,34 +607,34 @@ fn construct_const<'a, 'tcx>(
|
|||
builder.build_drop_trees();
|
||||
|
||||
builder.finish()
|
||||
})
|
||||
}
|
||||
|
||||
/// Construct MIR for an item that has had errors in type checking.
|
||||
///
|
||||
/// This is required because we may still want to run MIR passes on an item
|
||||
/// with type errors, but normal MIR construction can't handle that in general.
|
||||
fn construct_error<'a, 'tcx>(
|
||||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
def: ty::WithOptConstParam<LocalDefId>,
|
||||
hir_id: hir::HirId,
|
||||
body_id: hir::BodyId,
|
||||
fn construct_error<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def: LocalDefId,
|
||||
body_owner_kind: hir::BodyOwnerKind,
|
||||
err: ErrorGuaranteed,
|
||||
) -> Body<'tcx> {
|
||||
let tcx = infcx.tcx;
|
||||
let span = tcx.hir().span(hir_id);
|
||||
let span = tcx.def_span(def);
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def);
|
||||
let generator_kind = tcx.generator_kind(def);
|
||||
|
||||
let ty = tcx.ty_error();
|
||||
let generator_kind = tcx.hir().body(body_id).generator_kind;
|
||||
let num_params = match body_owner_kind {
|
||||
hir::BodyOwnerKind::Fn => tcx.hir().fn_decl_by_hir_id(hir_id).unwrap().inputs.len(),
|
||||
hir::BodyOwnerKind::Fn => tcx.fn_sig(def).inputs().skip_binder().len(),
|
||||
hir::BodyOwnerKind::Closure => {
|
||||
if generator_kind.is_some() {
|
||||
// Generators have an implicit `self` parameter *and* a possibly
|
||||
// implicit resume parameter.
|
||||
2
|
||||
} else {
|
||||
// The implicit self parameter adds another local in MIR.
|
||||
1 + tcx.hir().fn_decl_by_hir_id(hir_id).unwrap().inputs.len()
|
||||
let ty = tcx.type_of(def);
|
||||
match ty.kind() {
|
||||
ty::Closure(_, substs) => {
|
||||
1 + substs.as_closure().sig().inputs().skip_binder().len()
|
||||
}
|
||||
ty::Generator(..) => 2,
|
||||
_ => bug!("expected closure or generator, found {ty:?}"),
|
||||
}
|
||||
}
|
||||
hir::BodyOwnerKind::Const => 0,
|
||||
|
@ -808,7 +665,7 @@ fn construct_error<'a, 'tcx>(
|
|||
cfg.terminate(START_BLOCK, source_info, TerminatorKind::Unreachable);
|
||||
|
||||
let mut body = Body::new(
|
||||
MirSource::item(def.did.to_def_id()),
|
||||
MirSource::item(def.to_def_id()),
|
||||
cfg.basic_blocks,
|
||||
source_scopes,
|
||||
local_decls,
|
||||
|
@ -826,7 +683,7 @@ fn construct_error<'a, 'tcx>(
|
|||
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||
fn new(
|
||||
thir: &'a Thir<'tcx>,
|
||||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
infcx: InferCtxt<'a, 'tcx>,
|
||||
def: ty::WithOptConstParam<LocalDefId>,
|
||||
hir_id: hir::HirId,
|
||||
span: Span,
|
||||
|
@ -916,20 +773,21 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
&mut self,
|
||||
mut block: BasicBlock,
|
||||
fn_def_id: LocalDefId,
|
||||
arguments: &[ArgInfo<'tcx>],
|
||||
arguments: &IndexVec<ParamId, Param<'tcx>>,
|
||||
argument_scope: region::Scope,
|
||||
expr: &Expr<'tcx>,
|
||||
) -> BlockAnd<()> {
|
||||
// Allocate locals for the function arguments
|
||||
for &ArgInfo(ty, _, arg_opt, _) in arguments.iter() {
|
||||
for param in arguments.iter() {
|
||||
let source_info =
|
||||
SourceInfo::outermost(arg_opt.map_or(self.fn_span, |arg| arg.pat.span));
|
||||
let arg_local = self.local_decls.push(LocalDecl::with_source_info(ty, source_info));
|
||||
SourceInfo::outermost(param.pat.as_ref().map_or(self.fn_span, |pat| pat.span));
|
||||
let arg_local =
|
||||
self.local_decls.push(LocalDecl::with_source_info(param.ty, source_info));
|
||||
|
||||
// If this is a simple binding pattern, give debuginfo a nice name.
|
||||
if let Some(arg) = arg_opt && let Some(ident) = arg.pat.simple_ident() {
|
||||
if let Some(ref pat) = param.pat && let Some(name) = pat.simple_ident() {
|
||||
self.var_debug_info.push(VarDebugInfo {
|
||||
name: ident.name,
|
||||
name,
|
||||
source_info,
|
||||
value: VarDebugInfoContents::Place(arg_local.into()),
|
||||
});
|
||||
|
@ -1002,32 +860,28 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
|
||||
let mut scope = None;
|
||||
// Bind the argument patterns
|
||||
for (index, arg_info) in arguments.iter().enumerate() {
|
||||
for (index, param) in arguments.iter().enumerate() {
|
||||
// Function arguments always get the first Local indices after the return place
|
||||
let local = Local::new(index + 1);
|
||||
let place = Place::from(local);
|
||||
let &ArgInfo(_, opt_ty_info, arg_opt, ref self_binding) = arg_info;
|
||||
|
||||
// Make sure we drop (parts of) the argument even when not matched on.
|
||||
self.schedule_drop(
|
||||
arg_opt.as_ref().map_or(expr.span, |arg| arg.pat.span),
|
||||
param.pat.as_ref().map_or(expr.span, |pat| pat.span),
|
||||
argument_scope,
|
||||
local,
|
||||
DropKind::Value,
|
||||
);
|
||||
|
||||
let Some(arg) = arg_opt else {
|
||||
let Some(ref pat) = param.pat else {
|
||||
continue;
|
||||
};
|
||||
let pat = match tcx.hir().get(arg.pat.hir_id) {
|
||||
Node::Pat(pat) => pat,
|
||||
node => bug!("pattern became {:?}", node),
|
||||
};
|
||||
let pattern = pat_from_hir(tcx, self.param_env, self.typeck_results, pat);
|
||||
let original_source_scope = self.source_scope;
|
||||
let span = pattern.span;
|
||||
self.set_correct_source_scope_for_arg(arg.hir_id, original_source_scope, span);
|
||||
match pattern.kind {
|
||||
let span = pat.span;
|
||||
if let Some(arg_hir_id) = param.hir_id {
|
||||
self.set_correct_source_scope_for_arg(arg_hir_id, original_source_scope, span);
|
||||
}
|
||||
match pat.kind {
|
||||
// Don't introduce extra copies for simple bindings
|
||||
PatKind::Binding {
|
||||
mutability,
|
||||
|
@ -1038,16 +892,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
} => {
|
||||
self.local_decls[local].mutability = mutability;
|
||||
self.local_decls[local].source_info.scope = self.source_scope;
|
||||
self.local_decls[local].local_info = if let Some(kind) = self_binding {
|
||||
self.local_decls[local].local_info = if let Some(kind) = param.self_kind {
|
||||
Some(Box::new(LocalInfo::User(ClearCrossCrate::Set(
|
||||
BindingForm::ImplicitSelf(*kind),
|
||||
BindingForm::ImplicitSelf(kind),
|
||||
))))
|
||||
} else {
|
||||
let binding_mode = ty::BindingMode::BindByValue(mutability);
|
||||
Some(Box::new(LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(
|
||||
VarBindingForm {
|
||||
binding_mode,
|
||||
opt_ty_info,
|
||||
opt_ty_info: param.ty_span,
|
||||
opt_match_place: Some((None, span)),
|
||||
pat_span: span,
|
||||
},
|
||||
|
@ -1059,15 +913,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
scope = self.declare_bindings(
|
||||
scope,
|
||||
expr.span,
|
||||
&pattern,
|
||||
&pat,
|
||||
matches::ArmHasGuard(false),
|
||||
Some((Some(&place), span)),
|
||||
);
|
||||
let place_builder = PlaceBuilder::from(local);
|
||||
unpack!(
|
||||
block =
|
||||
self.place_into_pattern(block, pattern.as_ref(), place_builder, false)
|
||||
);
|
||||
unpack!(block = self.place_into_pattern(block, &pat, place_builder, false));
|
||||
}
|
||||
}
|
||||
self.source_scope = original_source_scope;
|
||||
|
|
|
@ -8,12 +8,14 @@ use crate::thir::util::UserAnnotatedTyHelpers;
|
|||
use rustc_data_structures::steal::Steal;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir::HirId;
|
||||
use rustc_hir::Node;
|
||||
use rustc_middle::middle::region;
|
||||
use rustc_middle::thir::*;
|
||||
use rustc_middle::ty::{self, RvalueScopes, TyCtxt};
|
||||
use rustc_middle::ty::{self, RvalueScopes, Subst, TyCtxt};
|
||||
use rustc_span::Span;
|
||||
|
||||
pub(crate) fn thir_body<'tcx>(
|
||||
|
@ -27,6 +29,26 @@ pub(crate) fn thir_body<'tcx>(
|
|||
return Err(reported);
|
||||
}
|
||||
let expr = cx.mirror_expr(&body.value);
|
||||
|
||||
let owner_id = hir.local_def_id_to_hir_id(owner_def.did);
|
||||
if let Some(ref fn_decl) = hir.fn_decl_by_hir_id(owner_id) {
|
||||
let closure_env_param = cx.closure_env_param(owner_def.did, owner_id);
|
||||
let explicit_params = cx.explicit_params(owner_id, fn_decl, body);
|
||||
cx.thir.params = closure_env_param.into_iter().chain(explicit_params).collect();
|
||||
|
||||
// The resume argument may be missing, in that case we need to provide it here.
|
||||
// It will always be `()` in this case.
|
||||
if tcx.def_kind(owner_def.did) == DefKind::Generator && body.params.is_empty() {
|
||||
cx.thir.params.push(Param {
|
||||
ty: tcx.mk_unit(),
|
||||
pat: None,
|
||||
ty_span: None,
|
||||
self_kind: None,
|
||||
hir_id: None,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Ok((tcx.alloc_steal_thir(cx.thir), expr))
|
||||
}
|
||||
|
||||
|
@ -44,11 +66,11 @@ struct Cx<'tcx> {
|
|||
tcx: TyCtxt<'tcx>,
|
||||
thir: Thir<'tcx>,
|
||||
|
||||
pub(crate) param_env: ty::ParamEnv<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
|
||||
pub(crate) region_scope_tree: &'tcx region::ScopeTree,
|
||||
pub(crate) typeck_results: &'tcx ty::TypeckResults<'tcx>,
|
||||
pub(crate) rvalue_scopes: &'tcx RvalueScopes,
|
||||
region_scope_tree: &'tcx region::ScopeTree,
|
||||
typeck_results: &'tcx ty::TypeckResults<'tcx>,
|
||||
rvalue_scopes: &'tcx RvalueScopes,
|
||||
|
||||
/// When applying adjustments to the expression
|
||||
/// with the given `HirId`, use the given `Span`,
|
||||
|
@ -78,13 +100,93 @@ impl<'tcx> Cx<'tcx> {
|
|||
}
|
||||
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
pub(crate) fn pattern_from_hir(&mut self, p: &hir::Pat<'_>) -> Box<Pat<'tcx>> {
|
||||
fn pattern_from_hir(&mut self, p: &hir::Pat<'_>) -> Box<Pat<'tcx>> {
|
||||
let p = match self.tcx.hir().get(p.hir_id) {
|
||||
Node::Pat(p) => p,
|
||||
node => bug!("pattern became {:?}", node),
|
||||
};
|
||||
pat_from_hir(self.tcx, self.param_env, self.typeck_results(), p)
|
||||
}
|
||||
|
||||
fn closure_env_param(&self, owner_def: LocalDefId, owner_id: HirId) -> Option<Param<'tcx>> {
|
||||
match self.tcx.def_kind(owner_def) {
|
||||
DefKind::Closure => {
|
||||
let closure_ty = self.typeck_results.node_type(owner_id);
|
||||
|
||||
let ty::Closure(closure_def_id, closure_substs) = *closure_ty.kind() else {
|
||||
bug!("closure expr does not have closure type: {:?}", closure_ty);
|
||||
};
|
||||
|
||||
let bound_vars = self.tcx.mk_bound_variable_kinds(std::iter::once(
|
||||
ty::BoundVariableKind::Region(ty::BrEnv),
|
||||
));
|
||||
let br = ty::BoundRegion {
|
||||
var: ty::BoundVar::from_usize(bound_vars.len() - 1),
|
||||
kind: ty::BrEnv,
|
||||
};
|
||||
let env_region = ty::ReLateBound(ty::INNERMOST, br);
|
||||
let closure_env_ty =
|
||||
self.tcx.closure_env_ty(closure_def_id, closure_substs, env_region).unwrap();
|
||||
let liberated_closure_env_ty = self.tcx.erase_late_bound_regions(
|
||||
ty::Binder::bind_with_vars(closure_env_ty, bound_vars),
|
||||
);
|
||||
let env_param = Param {
|
||||
ty: liberated_closure_env_ty,
|
||||
pat: None,
|
||||
ty_span: None,
|
||||
self_kind: None,
|
||||
hir_id: None,
|
||||
};
|
||||
|
||||
Some(env_param)
|
||||
}
|
||||
DefKind::Generator => {
|
||||
let gen_ty = self.typeck_results.node_type(owner_id);
|
||||
let gen_param =
|
||||
Param { ty: gen_ty, pat: None, ty_span: None, self_kind: None, hir_id: None };
|
||||
Some(gen_param)
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn explicit_params<'a>(
|
||||
&'a mut self,
|
||||
owner_id: HirId,
|
||||
fn_decl: &'tcx hir::FnDecl<'tcx>,
|
||||
body: &'tcx hir::Body<'tcx>,
|
||||
) -> impl Iterator<Item = Param<'tcx>> + 'a {
|
||||
let fn_sig = self.typeck_results.liberated_fn_sigs()[owner_id];
|
||||
|
||||
body.params.iter().enumerate().map(move |(index, param)| {
|
||||
let ty_span = fn_decl
|
||||
.inputs
|
||||
.get(index)
|
||||
// Make sure that inferred closure args have no type span
|
||||
.and_then(|ty| if param.pat.span != ty.span { Some(ty.span) } else { None });
|
||||
|
||||
let self_kind = if index == 0 && fn_decl.implicit_self.has_implicit_self() {
|
||||
Some(fn_decl.implicit_self)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
// C-variadic fns also have a `VaList` input that's not listed in `fn_sig`
|
||||
// (as it's created inside the body itself, not passed in from outside).
|
||||
let ty = if fn_decl.c_variadic && index == fn_decl.inputs.len() {
|
||||
let va_list_did = self.tcx.require_lang_item(LangItem::VaList, Some(param.span));
|
||||
|
||||
self.tcx
|
||||
.bound_type_of(va_list_did)
|
||||
.subst(self.tcx, &[self.tcx.lifetimes.re_erased.into()])
|
||||
} else {
|
||||
fn_sig.inputs()[index]
|
||||
};
|
||||
|
||||
let pat = self.pattern_from_hir(param.pat);
|
||||
Param { pat: Some(pat), ty, ty_span, self_kind, hir_id: Some(param.hir_id) }
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> UserAnnotatedTyHelpers<'tcx> for Cx<'tcx> {
|
||||
|
|
|
@ -29,22 +29,22 @@ use rustc_span::{Span, Symbol};
|
|||
use std::cmp::Ordering;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub(crate) enum PatternError {
|
||||
enum PatternError {
|
||||
AssocConstInPattern(Span),
|
||||
ConstParamInPattern(Span),
|
||||
StaticInPattern(Span),
|
||||
NonConstPath(Span),
|
||||
}
|
||||
|
||||
pub(crate) struct PatCtxt<'a, 'tcx> {
|
||||
pub(crate) tcx: TyCtxt<'tcx>,
|
||||
pub(crate) param_env: ty::ParamEnv<'tcx>,
|
||||
pub(crate) typeck_results: &'a ty::TypeckResults<'tcx>,
|
||||
pub(crate) errors: Vec<PatternError>,
|
||||
struct PatCtxt<'a, 'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
typeck_results: &'a ty::TypeckResults<'tcx>,
|
||||
errors: Vec<PatternError>,
|
||||
include_lint_checks: bool,
|
||||
}
|
||||
|
||||
pub(crate) fn pat_from_hir<'a, 'tcx>(
|
||||
pub(super) fn pat_from_hir<'a, 'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
typeck_results: &'a ty::TypeckResults<'tcx>,
|
||||
|
@ -61,7 +61,7 @@ pub(crate) fn pat_from_hir<'a, 'tcx>(
|
|||
}
|
||||
|
||||
impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
||||
pub(crate) fn new(
|
||||
fn new(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
typeck_results: &'a ty::TypeckResults<'tcx>,
|
||||
|
@ -69,12 +69,12 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
|||
PatCtxt { tcx, param_env, typeck_results, errors: vec![], include_lint_checks: false }
|
||||
}
|
||||
|
||||
pub(crate) fn include_lint_checks(&mut self) -> &mut Self {
|
||||
fn include_lint_checks(&mut self) -> &mut Self {
|
||||
self.include_lint_checks = true;
|
||||
self
|
||||
}
|
||||
|
||||
pub(crate) fn lower_pattern(&mut self, pat: &'tcx hir::Pat<'tcx>) -> Box<Pat<'tcx>> {
|
||||
fn lower_pattern(&mut self, pat: &'tcx hir::Pat<'tcx>) -> Box<Pat<'tcx>> {
|
||||
// When implicit dereferences have been inserted in this pattern, the unadjusted lowered
|
||||
// pattern has the type that results *after* dereferencing. For example, in this code:
|
||||
//
|
||||
|
@ -627,7 +627,7 @@ impl<'tcx> UserAnnotatedTyHelpers<'tcx> for PatCtxt<'_, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
pub(crate) trait PatternFoldable<'tcx>: Sized {
|
||||
trait PatternFoldable<'tcx>: Sized {
|
||||
fn fold_with<F: PatternFolder<'tcx>>(&self, folder: &mut F) -> Self {
|
||||
self.super_fold_with(folder)
|
||||
}
|
||||
|
@ -635,7 +635,7 @@ pub(crate) trait PatternFoldable<'tcx>: Sized {
|
|||
fn super_fold_with<F: PatternFolder<'tcx>>(&self, folder: &mut F) -> Self;
|
||||
}
|
||||
|
||||
pub(crate) trait PatternFolder<'tcx>: Sized {
|
||||
trait PatternFolder<'tcx>: Sized {
|
||||
fn fold_pattern(&mut self, pattern: &Pat<'tcx>) -> Pat<'tcx> {
|
||||
pattern.super_fold_with(self)
|
||||
}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
pub use crate::very_unstable::hir::ImplicitSelfKind;
|
||||
pub use crate::very_unstable::middle::mir::{
|
||||
visit::MutVisitor, AggregateKind, AssertKind, BasicBlock, BasicBlockData, BinOp, BindingForm,
|
||||
BlockTailInfo, Body, BorrowKind, CastKind, ClearCrossCrate, Constant, ConstantKind,
|
||||
CopyNonOverlapping, Coverage, FakeReadCause, Field, GeneratorInfo, ImplicitSelfKind,
|
||||
InlineAsmOperand, Local, LocalDecl, LocalInfo, LocalKind, Location, MirPhase, MirSource,
|
||||
NullOp, Operand, Place, PlaceRef, ProjectionElem, ProjectionKind, Promoted, RetagKind, Rvalue,
|
||||
Safety, SourceInfo, SourceScope, SourceScopeData, SourceScopeLocalData, Statement,
|
||||
StatementKind, UnOp, UserTypeProjection, UserTypeProjections, VarBindingForm, VarDebugInfo,
|
||||
VarDebugInfoContents,
|
||||
CopyNonOverlapping, Coverage, FakeReadCause, Field, GeneratorInfo, InlineAsmOperand, Local,
|
||||
LocalDecl, LocalInfo, LocalKind, Location, MirPhase, MirSource, NullOp, Operand, Place,
|
||||
PlaceRef, ProjectionElem, ProjectionKind, Promoted, RetagKind, Rvalue, Safety, SourceInfo,
|
||||
SourceScope, SourceScopeData, SourceScopeLocalData, Statement, StatementKind, UnOp,
|
||||
UserTypeProjection, UserTypeProjections, VarBindingForm, VarDebugInfo, VarDebugInfoContents,
|
||||
};
|
||||
|
|
|
@ -27,11 +27,11 @@ fn generator_test() -> impl Generator<Yield = i32, Return = ()> {
|
|||
// CHECK-NOT: flags: DIFlagArtificial
|
||||
// CHECK-SAME: )
|
||||
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant1", scope: [[GEN]],
|
||||
// CHECK-SAME: file: [[FILE]], line: 14,
|
||||
// CHECK-SAME: file: [[FILE]], line: 18,
|
||||
// CHECK-NOT: flags: DIFlagArtificial
|
||||
// CHECK-SAME: )
|
||||
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant2", scope: [[GEN]],
|
||||
// CHECK-SAME: file: [[FILE]], line: 14,
|
||||
// CHECK-SAME: file: [[FILE]], line: 18,
|
||||
// CHECK-NOT: flags: DIFlagArtificial
|
||||
// CHECK-SAME: )
|
||||
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant3", scope: [[GEN]],
|
||||
|
|
|
@ -33,11 +33,11 @@ fn generator_test() -> impl Generator<Yield = i32, Return = ()> {
|
|||
// CHECK-NOT: flags: DIFlagArtificial
|
||||
// CHECK-SAME: )
|
||||
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]],
|
||||
// CHECK-SAME: file: [[FILE]], line: 14,
|
||||
// CHECK-SAME: file: [[FILE]], line: 18,
|
||||
// CHECK-NOT: flags: DIFlagArtificial
|
||||
// CHECK-SAME: )
|
||||
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]],
|
||||
// CHECK-SAME: file: [[FILE]], line: 14,
|
||||
// CHECK-SAME: file: [[FILE]], line: 18,
|
||||
// CHECK-NOT: flags: DIFlagArtificial
|
||||
// CHECK-SAME: )
|
||||
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]],
|
||||
|
|
|
@ -40,11 +40,11 @@
|
|||
- StorageDead(_5); // scope 0 at $DIR/const-promotion-extern-static.rs:+0:43: +0:44
|
||||
- StorageDead(_3); // scope 0 at $DIR/const-promotion-extern-static.rs:+0:43: +0:44
|
||||
StorageDead(_1); // scope 0 at $DIR/const-promotion-extern-static.rs:+0:43: +0:44
|
||||
return; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:44
|
||||
return; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:45
|
||||
}
|
||||
|
||||
bb2 (cleanup): {
|
||||
resume; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:44
|
||||
resume; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:45
|
||||
}
|
||||
- }
|
||||
-
|
||||
|
|
|
@ -12,6 +12,6 @@ static BOP: &i32 = {
|
|||
_1 = &_2; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:20: +0:23
|
||||
_0 = &(*_1); // scope 0 at $DIR/const-promotion-extern-static.rs:+0:20: +0:23
|
||||
StorageDead(_1); // scope 0 at $DIR/const-promotion-extern-static.rs:+0:22: +0:23
|
||||
return; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:23
|
||||
return; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:24
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,11 +42,11 @@
|
|||
- StorageDead(_5); // scope 0 at $DIR/const-promotion-extern-static.rs:+0:54: +0:55
|
||||
- StorageDead(_3); // scope 0 at $DIR/const-promotion-extern-static.rs:+0:54: +0:55
|
||||
StorageDead(_1); // scope 0 at $DIR/const-promotion-extern-static.rs:+0:54: +0:55
|
||||
return; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:55
|
||||
return; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:56
|
||||
}
|
||||
|
||||
bb2 (cleanup): {
|
||||
resume; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:55
|
||||
resume; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:1: +0:56
|
||||
}
|
||||
}
|
||||
-
|
||||
|
|
|
@ -15,70 +15,70 @@
|
|||
} */
|
||||
|
||||
fn main::{closure#0}(_1: *mut [generator@$DIR/generator-drop-cleanup.rs:10:15: 10:17]) -> () {
|
||||
let mut _0: (); // return place in scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
let mut _2: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
let _3: std::string::String; // in scope 0 at $DIR/generator-drop-cleanup.rs:11:13: 11:15
|
||||
let _4: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:12:9: 12:14
|
||||
let mut _5: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:12:9: 12:14
|
||||
let mut _6: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:10:18: 10:18
|
||||
let mut _7: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
let mut _8: u32; // in scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
let mut _0: (); // return place in scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
let mut _2: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
let _3: std::string::String; // in scope 0 at $DIR/generator-drop-cleanup.rs:+1:13: +1:15
|
||||
let _4: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:+2:9: +2:14
|
||||
let mut _5: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:+2:9: +2:14
|
||||
let mut _6: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:+0:18: +0:18
|
||||
let mut _7: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
let mut _8: u32; // in scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
scope 1 {
|
||||
debug _s => (((*_1) as variant#3).0: std::string::String); // in scope 1 at $DIR/generator-drop-cleanup.rs:11:13: 11:15
|
||||
debug _s => (((*_1) as variant#3).0: std::string::String); // in scope 1 at $DIR/generator-drop-cleanup.rs:+1:13: +1:15
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_8 = discriminant((*_1)); // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
switchInt(move _8) -> [0_u32: bb7, 3_u32: bb10, otherwise: bb11]; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
_8 = discriminant((*_1)); // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
switchInt(move _8) -> [0_u32: bb7, 3_u32: bb10, otherwise: bb11]; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_5); // scope 1 at $DIR/generator-drop-cleanup.rs:12:13: 12:14
|
||||
StorageDead(_4); // scope 1 at $DIR/generator-drop-cleanup.rs:12:14: 12:15
|
||||
drop((((*_1) as variant#3).0: std::string::String)) -> [return: bb2, unwind: bb5]; // scope 0 at $DIR/generator-drop-cleanup.rs:13:5: 13:6
|
||||
StorageDead(_5); // scope 1 at $DIR/generator-drop-cleanup.rs:+2:13: +2:14
|
||||
StorageDead(_4); // scope 1 at $DIR/generator-drop-cleanup.rs:+2:14: +2:15
|
||||
drop((((*_1) as variant#3).0: std::string::String)) -> [return: bb2, unwind: bb5]; // scope 0 at $DIR/generator-drop-cleanup.rs:+3:5: +3:6
|
||||
}
|
||||
|
||||
bb2: {
|
||||
nop; // scope 0 at $DIR/generator-drop-cleanup.rs:13:5: 13:6
|
||||
goto -> bb8; // scope 0 at $DIR/generator-drop-cleanup.rs:13:5: 13:6
|
||||
nop; // scope 0 at $DIR/generator-drop-cleanup.rs:+3:5: +3:6
|
||||
goto -> bb8; // scope 0 at $DIR/generator-drop-cleanup.rs:+3:5: +3:6
|
||||
}
|
||||
|
||||
bb3: {
|
||||
return; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
return; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
}
|
||||
|
||||
bb4 (cleanup): {
|
||||
resume; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
resume; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
}
|
||||
|
||||
bb5 (cleanup): {
|
||||
nop; // scope 0 at $DIR/generator-drop-cleanup.rs:13:5: 13:6
|
||||
goto -> bb4; // scope 0 at $DIR/generator-drop-cleanup.rs:13:5: 13:6
|
||||
nop; // scope 0 at $DIR/generator-drop-cleanup.rs:+3:5: +3:6
|
||||
goto -> bb4; // scope 0 at $DIR/generator-drop-cleanup.rs:+3:5: +3:6
|
||||
}
|
||||
|
||||
bb6: {
|
||||
return; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
return; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
}
|
||||
|
||||
bb7: {
|
||||
goto -> bb9; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
goto -> bb9; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
}
|
||||
|
||||
bb8: {
|
||||
goto -> bb3; // scope 0 at $DIR/generator-drop-cleanup.rs:13:5: 13:6
|
||||
goto -> bb3; // scope 0 at $DIR/generator-drop-cleanup.rs:+3:5: +3:6
|
||||
}
|
||||
|
||||
bb9: {
|
||||
goto -> bb6; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
goto -> bb6; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
}
|
||||
|
||||
bb10: {
|
||||
StorageLive(_4); // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
StorageLive(_5); // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
goto -> bb1; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
StorageLive(_4); // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
StorageLive(_5); // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
goto -> bb1; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
}
|
||||
|
||||
bb11: {
|
||||
return; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +0:17
|
||||
return; // scope 0 at $DIR/generator-drop-cleanup.rs:+0:15: +3:6
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,122 +3,122 @@
|
|||
fn main::{closure#0}(_1: [generator@$DIR/generator-storage-dead-unwind.rs:22:16: 22:18], _2: ()) -> ()
|
||||
yields ()
|
||||
{
|
||||
let mut _0: (); // return place in scope 0 at $DIR/generator-storage-dead-unwind.rs:22:19: 22:19
|
||||
let _3: Foo; // in scope 0 at $DIR/generator-storage-dead-unwind.rs:23:13: 23:14
|
||||
let _5: (); // in scope 0 at $DIR/generator-storage-dead-unwind.rs:25:9: 25:14
|
||||
let mut _6: (); // in scope 0 at $DIR/generator-storage-dead-unwind.rs:25:9: 25:14
|
||||
let _7: (); // in scope 0 at $DIR/generator-storage-dead-unwind.rs:26:9: 26:16
|
||||
let mut _8: Foo; // in scope 0 at $DIR/generator-storage-dead-unwind.rs:26:14: 26:15
|
||||
let _9: (); // in scope 0 at $DIR/generator-storage-dead-unwind.rs:27:9: 27:16
|
||||
let mut _10: Bar; // in scope 0 at $DIR/generator-storage-dead-unwind.rs:27:14: 27:15
|
||||
let mut _0: (); // return place in scope 0 at $DIR/generator-storage-dead-unwind.rs:+0:19: +0:19
|
||||
let _3: Foo; // in scope 0 at $DIR/generator-storage-dead-unwind.rs:+1:13: +1:14
|
||||
let _5: (); // in scope 0 at $DIR/generator-storage-dead-unwind.rs:+3:9: +3:14
|
||||
let mut _6: (); // in scope 0 at $DIR/generator-storage-dead-unwind.rs:+3:9: +3:14
|
||||
let _7: (); // in scope 0 at $DIR/generator-storage-dead-unwind.rs:+4:9: +4:16
|
||||
let mut _8: Foo; // in scope 0 at $DIR/generator-storage-dead-unwind.rs:+4:14: +4:15
|
||||
let _9: (); // in scope 0 at $DIR/generator-storage-dead-unwind.rs:+5:9: +5:16
|
||||
let mut _10: Bar; // in scope 0 at $DIR/generator-storage-dead-unwind.rs:+5:14: +5:15
|
||||
scope 1 {
|
||||
debug a => _3; // in scope 1 at $DIR/generator-storage-dead-unwind.rs:23:13: 23:14
|
||||
let _4: Bar; // in scope 1 at $DIR/generator-storage-dead-unwind.rs:24:13: 24:14
|
||||
debug a => _3; // in scope 1 at $DIR/generator-storage-dead-unwind.rs:+1:13: +1:14
|
||||
let _4: Bar; // in scope 1 at $DIR/generator-storage-dead-unwind.rs:+2:13: +2:14
|
||||
scope 2 {
|
||||
debug b => _4; // in scope 2 at $DIR/generator-storage-dead-unwind.rs:24:13: 24:14
|
||||
debug b => _4; // in scope 2 at $DIR/generator-storage-dead-unwind.rs:+2:13: +2:14
|
||||
}
|
||||
}
|
||||
|
||||
bb0: {
|
||||
StorageLive(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:23:13: 23:14
|
||||
_3 = Foo(const 5_i32); // scope 0 at $DIR/generator-storage-dead-unwind.rs:23:17: 23:23
|
||||
StorageLive(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:24:13: 24:14
|
||||
_4 = Bar(const 6_i32); // scope 1 at $DIR/generator-storage-dead-unwind.rs:24:17: 24:23
|
||||
StorageLive(_5); // scope 2 at $DIR/generator-storage-dead-unwind.rs:25:9: 25:14
|
||||
StorageLive(_6); // scope 2 at $DIR/generator-storage-dead-unwind.rs:25:9: 25:14
|
||||
_6 = (); // scope 2 at $DIR/generator-storage-dead-unwind.rs:25:9: 25:14
|
||||
_5 = yield(move _6) -> [resume: bb1, drop: bb6]; // scope 2 at $DIR/generator-storage-dead-unwind.rs:25:9: 25:14
|
||||
StorageLive(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:+1:13: +1:14
|
||||
_3 = Foo(const 5_i32); // scope 0 at $DIR/generator-storage-dead-unwind.rs:+1:17: +1:23
|
||||
StorageLive(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:+2:13: +2:14
|
||||
_4 = Bar(const 6_i32); // scope 1 at $DIR/generator-storage-dead-unwind.rs:+2:17: +2:23
|
||||
StorageLive(_5); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+3:9: +3:14
|
||||
StorageLive(_6); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+3:9: +3:14
|
||||
_6 = (); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+3:9: +3:14
|
||||
_5 = yield(move _6) -> [resume: bb1, drop: bb6]; // scope 2 at $DIR/generator-storage-dead-unwind.rs:+3:9: +3:14
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_6); // scope 2 at $DIR/generator-storage-dead-unwind.rs:25:13: 25:14
|
||||
StorageDead(_5); // scope 2 at $DIR/generator-storage-dead-unwind.rs:25:14: 25:15
|
||||
StorageLive(_7); // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:9: 26:16
|
||||
StorageLive(_8); // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:14: 26:15
|
||||
_8 = move _3; // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:14: 26:15
|
||||
_7 = take::<Foo>(move _8) -> [return: bb2, unwind: bb10]; // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:9: 26:16
|
||||
StorageDead(_6); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+3:13: +3:14
|
||||
StorageDead(_5); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+3:14: +3:15
|
||||
StorageLive(_7); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:9: +4:16
|
||||
StorageLive(_8); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:14: +4:15
|
||||
_8 = move _3; // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:14: +4:15
|
||||
_7 = take::<Foo>(move _8) -> [return: bb2, unwind: bb10]; // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:9: +4:16
|
||||
// mir::Constant
|
||||
// + span: $DIR/generator-storage-dead-unwind.rs:26:9: 26:13
|
||||
// + literal: Const { ty: fn(Foo) {take::<Foo>}, val: Value(<ZST>) }
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_8); // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:15: 26:16
|
||||
StorageDead(_7); // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:16: 26:17
|
||||
StorageLive(_9); // scope 2 at $DIR/generator-storage-dead-unwind.rs:27:9: 27:16
|
||||
StorageLive(_10); // scope 2 at $DIR/generator-storage-dead-unwind.rs:27:14: 27:15
|
||||
_10 = move _4; // scope 2 at $DIR/generator-storage-dead-unwind.rs:27:14: 27:15
|
||||
_9 = take::<Bar>(move _10) -> [return: bb3, unwind: bb9]; // scope 2 at $DIR/generator-storage-dead-unwind.rs:27:9: 27:16
|
||||
StorageDead(_8); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:15: +4:16
|
||||
StorageDead(_7); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:16: +4:17
|
||||
StorageLive(_9); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+5:9: +5:16
|
||||
StorageLive(_10); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+5:14: +5:15
|
||||
_10 = move _4; // scope 2 at $DIR/generator-storage-dead-unwind.rs:+5:14: +5:15
|
||||
_9 = take::<Bar>(move _10) -> [return: bb3, unwind: bb9]; // scope 2 at $DIR/generator-storage-dead-unwind.rs:+5:9: +5:16
|
||||
// mir::Constant
|
||||
// + span: $DIR/generator-storage-dead-unwind.rs:27:9: 27:13
|
||||
// + literal: Const { ty: fn(Bar) {take::<Bar>}, val: Value(<ZST>) }
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_10); // scope 2 at $DIR/generator-storage-dead-unwind.rs:27:15: 27:16
|
||||
StorageDead(_9); // scope 2 at $DIR/generator-storage-dead-unwind.rs:27:16: 27:17
|
||||
_0 = const (); // scope 0 at $DIR/generator-storage-dead-unwind.rs:22:19: 28:6
|
||||
StorageDead(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
goto -> bb4; // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
StorageDead(_10); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+5:15: +5:16
|
||||
StorageDead(_9); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+5:16: +5:17
|
||||
_0 = const (); // scope 0 at $DIR/generator-storage-dead-unwind.rs:+0:19: +6:6
|
||||
StorageDead(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
goto -> bb4; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
drop(_1) -> [return: bb5, unwind: bb14]; // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
StorageDead(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
drop(_1) -> [return: bb5, unwind: bb14]; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
}
|
||||
|
||||
bb5: {
|
||||
return; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+0:18: +0:18
|
||||
return; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:6: +6:6
|
||||
}
|
||||
|
||||
bb6: {
|
||||
StorageDead(_6); // scope 2 at $DIR/generator-storage-dead-unwind.rs:25:13: 25:14
|
||||
StorageDead(_5); // scope 2 at $DIR/generator-storage-dead-unwind.rs:25:14: 25:15
|
||||
StorageDead(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
drop(_3) -> [return: bb7, unwind: bb15]; // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
StorageDead(_6); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+3:13: +3:14
|
||||
StorageDead(_5); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+3:14: +3:15
|
||||
StorageDead(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
drop(_3) -> [return: bb7, unwind: bb15]; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
}
|
||||
|
||||
bb7: {
|
||||
StorageDead(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
drop(_1) -> [return: bb8, unwind: bb14]; // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
StorageDead(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
drop(_1) -> [return: bb8, unwind: bb14]; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
}
|
||||
|
||||
bb8: {
|
||||
generator_drop; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+0:16: +0:18
|
||||
generator_drop; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+0:16: +6:6
|
||||
}
|
||||
|
||||
bb9 (cleanup): {
|
||||
StorageDead(_10); // scope 2 at $DIR/generator-storage-dead-unwind.rs:27:15: 27:16
|
||||
StorageDead(_9); // scope 2 at $DIR/generator-storage-dead-unwind.rs:27:16: 27:17
|
||||
StorageDead(_10); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+5:15: +5:16
|
||||
StorageDead(_9); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+5:16: +5:17
|
||||
goto -> bb12; // scope 2 at no-location
|
||||
}
|
||||
|
||||
bb10 (cleanup): {
|
||||
goto -> bb11; // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:15: 26:16
|
||||
goto -> bb11; // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:15: +4:16
|
||||
}
|
||||
|
||||
bb11 (cleanup): {
|
||||
StorageDead(_8); // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:15: 26:16
|
||||
StorageDead(_7); // scope 2 at $DIR/generator-storage-dead-unwind.rs:26:16: 26:17
|
||||
StorageDead(_8); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:15: +4:16
|
||||
StorageDead(_7); // scope 2 at $DIR/generator-storage-dead-unwind.rs:+4:16: +4:17
|
||||
goto -> bb12; // scope 2 at no-location
|
||||
}
|
||||
|
||||
bb12 (cleanup): {
|
||||
StorageDead(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
goto -> bb13; // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
StorageDead(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
goto -> bb13; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
}
|
||||
|
||||
bb13 (cleanup): {
|
||||
StorageDead(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
drop(_1) -> bb14; // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
StorageDead(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
drop(_1) -> bb14; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
}
|
||||
|
||||
bb14 (cleanup): {
|
||||
resume; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+0:16: +0:18
|
||||
resume; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+0:16: +6:6
|
||||
}
|
||||
|
||||
bb15 (cleanup): {
|
||||
StorageDead(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
drop(_1) -> bb14; // scope 0 at $DIR/generator-storage-dead-unwind.rs:28:5: 28:6
|
||||
StorageDead(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
drop(_1) -> bb14; // scope 0 at $DIR/generator-storage-dead-unwind.rs:+6:5: +6:6
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,69 +16,69 @@
|
|||
|
||||
fn main::{closure#0}(_1: Pin<&mut [generator@$DIR/generator-tiny.rs:19:16: 19:24]>, _2: u8) -> GeneratorState<(), ()> {
|
||||
debug _x => _10; // in scope 0 at $DIR/generator-tiny.rs:+0:17: +0:19
|
||||
let mut _0: std::ops::GeneratorState<(), ()>; // return place in scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
let _3: HasDrop; // in scope 0 at $DIR/generator-tiny.rs:20:13: 20:15
|
||||
let mut _4: !; // in scope 0 at $DIR/generator-tiny.rs:21:9: 24:10
|
||||
let mut _5: (); // in scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
let _6: u8; // in scope 0 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
let mut _7: (); // in scope 0 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
let _8: (); // in scope 0 at $DIR/generator-tiny.rs:23:13: 23:21
|
||||
let mut _9: (); // in scope 0 at $DIR/generator-tiny.rs:19:25: 19:25
|
||||
let mut _0: std::ops::GeneratorState<(), ()>; // return place in scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
let _3: HasDrop; // in scope 0 at $DIR/generator-tiny.rs:+1:13: +1:15
|
||||
let mut _4: !; // in scope 0 at $DIR/generator-tiny.rs:+2:9: +5:10
|
||||
let mut _5: (); // in scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
let _6: u8; // in scope 0 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
let mut _7: (); // in scope 0 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
let _8: (); // in scope 0 at $DIR/generator-tiny.rs:+4:13: +4:21
|
||||
let mut _9: (); // in scope 0 at $DIR/generator-tiny.rs:+0:25: +0:25
|
||||
let _10: u8; // in scope 0 at $DIR/generator-tiny.rs:+0:17: +0:19
|
||||
let mut _11: u32; // in scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
let mut _11: u32; // in scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
scope 1 {
|
||||
debug _d => (((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 19:24])) as variant#3).0: HasDrop); // in scope 1 at $DIR/generator-tiny.rs:20:13: 20:15
|
||||
debug _d => (((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 19:24])) as variant#3).0: HasDrop); // in scope 1 at $DIR/generator-tiny.rs:+1:13: +1:15
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_11 = discriminant((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 19:24]))); // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
switchInt(move _11) -> [0_u32: bb1, 3_u32: bb5, otherwise: bb6]; // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
_11 = discriminant((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 19:24]))); // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
switchInt(move _11) -> [0_u32: bb1, 3_u32: bb5, otherwise: bb6]; // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_10 = move _2; // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
nop; // scope 0 at $DIR/generator-tiny.rs:20:13: 20:15
|
||||
(((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 19:24])) as variant#3).0: HasDrop) = HasDrop; // scope 0 at $DIR/generator-tiny.rs:20:18: 20:25
|
||||
StorageLive(_4); // scope 1 at $DIR/generator-tiny.rs:21:9: 24:10
|
||||
goto -> bb2; // scope 1 at $DIR/generator-tiny.rs:21:9: 24:10
|
||||
_10 = move _2; // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
nop; // scope 0 at $DIR/generator-tiny.rs:+1:13: +1:15
|
||||
(((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 19:24])) as variant#3).0: HasDrop) = HasDrop; // scope 0 at $DIR/generator-tiny.rs:+1:18: +1:25
|
||||
StorageLive(_4); // scope 1 at $DIR/generator-tiny.rs:+2:9: +5:10
|
||||
goto -> bb2; // scope 1 at $DIR/generator-tiny.rs:+2:9: +5:10
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageLive(_6); // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
StorageLive(_7); // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
_7 = (); // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
Deinit(_0); // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
((_0 as Yielded).0: ()) = move _7; // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
discriminant(_0) = 0; // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
discriminant((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 19:24]))) = 3; // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
return; // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
|
||||
StorageLive(_6); // scope 1 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
StorageLive(_7); // scope 1 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
_7 = (); // scope 1 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
Deinit(_0); // scope 1 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
((_0 as Yielded).0: ()) = move _7; // scope 1 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
discriminant(_0) = 0; // scope 1 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
discriminant((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 19:24]))) = 3; // scope 1 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
return; // scope 1 at $DIR/generator-tiny.rs:+3:13: +3:18
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_7); // scope 1 at $DIR/generator-tiny.rs:22:17: 22:18
|
||||
StorageDead(_6); // scope 1 at $DIR/generator-tiny.rs:22:18: 22:19
|
||||
StorageLive(_8); // scope 1 at $DIR/generator-tiny.rs:23:13: 23:21
|
||||
_8 = callee() -> bb4; // scope 1 at $DIR/generator-tiny.rs:23:13: 23:21
|
||||
StorageDead(_7); // scope 1 at $DIR/generator-tiny.rs:+3:17: +3:18
|
||||
StorageDead(_6); // scope 1 at $DIR/generator-tiny.rs:+3:18: +3:19
|
||||
StorageLive(_8); // scope 1 at $DIR/generator-tiny.rs:+4:13: +4:21
|
||||
_8 = callee() -> bb4; // scope 1 at $DIR/generator-tiny.rs:+4:13: +4:21
|
||||
// mir::Constant
|
||||
// + span: $DIR/generator-tiny.rs:23:13: 23:19
|
||||
// + literal: Const { ty: fn() {callee}, val: Value(<ZST>) }
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8); // scope 1 at $DIR/generator-tiny.rs:23:21: 23:22
|
||||
_5 = const (); // scope 1 at $DIR/generator-tiny.rs:21:14: 24:10
|
||||
goto -> bb2; // scope 1 at $DIR/generator-tiny.rs:21:9: 24:10
|
||||
StorageDead(_8); // scope 1 at $DIR/generator-tiny.rs:+4:21: +4:22
|
||||
_5 = const (); // scope 1 at $DIR/generator-tiny.rs:+2:14: +5:10
|
||||
goto -> bb2; // scope 1 at $DIR/generator-tiny.rs:+2:9: +5:10
|
||||
}
|
||||
|
||||
bb5: {
|
||||
StorageLive(_4); // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
StorageLive(_6); // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
StorageLive(_7); // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
_6 = move _2; // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
goto -> bb3; // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
StorageLive(_4); // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
StorageLive(_6); // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
StorageLive(_7); // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
_6 = move _2; // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
goto -> bb3; // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
}
|
||||
|
||||
bb6: {
|
||||
unreachable; // scope 0 at $DIR/generator-tiny.rs:+0:16: +0:24
|
||||
unreachable; // scope 0 at $DIR/generator-tiny.rs:+0:16: +6:6
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,8 +19,8 @@ fn foo(_1: T, _2: i32) -> (i32, T) {
|
|||
debug t => (*((*_6).1: &T)); // in scope 2 at $DIR/inline-closure-captures.rs:+0:17: +0:18
|
||||
let mut _10: i32; // in scope 2 at $DIR/inline-closure-captures.rs:+1:19: +1:20
|
||||
let mut _11: T; // in scope 2 at $DIR/inline-closure-captures.rs:+1:22: +1:23
|
||||
let mut _12: &i32; // in scope 2 at $DIR/inline-closure-captures.rs:+1:13: +1:17
|
||||
let mut _13: &T; // in scope 2 at $DIR/inline-closure-captures.rs:+1:13: +1:17
|
||||
let mut _12: &i32; // in scope 2 at $DIR/inline-closure-captures.rs:+1:13: +1:24
|
||||
let mut _13: &T; // in scope 2 at $DIR/inline-closure-captures.rs:+1:13: +1:24
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,10 +29,10 @@
|
|||
+ let mut _9: bool; // in scope 6 at $DIR/inline-generator.rs:15:20: 15:21
|
||||
+ let mut _10: bool; // in scope 6 at $DIR/inline-generator.rs:15:9: 15:9
|
||||
+ let _11: bool; // in scope 6 at $DIR/inline-generator.rs:15:6: 15:7
|
||||
+ let mut _12: u32; // in scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ let mut _13: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]; // in scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ let mut _14: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]; // in scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ let mut _15: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]; // in scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ let mut _12: u32; // in scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ let mut _13: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]; // in scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ let mut _14: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]; // in scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ let mut _15: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]; // in scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ }
|
||||
|
||||
bb0: {
|
||||
|
@ -75,9 +75,9 @@
|
|||
+ _7 = const false; // scope 0 at $DIR/inline-generator.rs:+1:14: +1:46
|
||||
+ StorageLive(_10); // scope 0 at $DIR/inline-generator.rs:+1:14: +1:46
|
||||
+ StorageLive(_11); // scope 0 at $DIR/inline-generator.rs:+1:14: +1:46
|
||||
+ _13 = deref_copy (_2.0: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]); // scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ _12 = discriminant((*_13)); // scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ switchInt(move _12) -> [0_u32: bb3, 1_u32: bb8, 3_u32: bb7, otherwise: bb9]; // scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ _13 = deref_copy (_2.0: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]); // scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ _12 = discriminant((*_13)); // scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ switchInt(move _12) -> [0_u32: bb3, 1_u32: bb8, 3_u32: bb7, otherwise: bb9]; // scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
}
|
||||
|
||||
- bb3: {
|
||||
|
@ -98,7 +98,7 @@
|
|||
+ }
|
||||
+
|
||||
+ bb3: {
|
||||
+ _11 = move _7; // scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ _11 = move _7; // scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ StorageLive(_8); // scope 6 at $DIR/inline-generator.rs:15:17: 15:39
|
||||
+ StorageLive(_9); // scope 6 at $DIR/inline-generator.rs:15:20: 15:21
|
||||
+ _9 = _11; // scope 6 at $DIR/inline-generator.rs:15:20: 15:21
|
||||
|
@ -126,23 +126,23 @@
|
|||
+ }
|
||||
+
|
||||
+ bb7: {
|
||||
+ StorageLive(_8); // scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ _10 = move _7; // scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ StorageLive(_8); // scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ _10 = move _7; // scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ StorageDead(_8); // scope 6 at $DIR/inline-generator.rs:15:38: 15:39
|
||||
+ Deinit(_1); // scope 6 at $DIR/inline-generator.rs:15:8: 15:8
|
||||
+ ((_1 as Complete).0: bool) = move _10; // scope 6 at $DIR/inline-generator.rs:15:8: 15:8
|
||||
+ discriminant(_1) = 1; // scope 6 at $DIR/inline-generator.rs:15:8: 15:8
|
||||
+ _15 = deref_copy (_2.0: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]); // scope 6 at $DIR/inline-generator.rs:15:8: 15:8
|
||||
+ discriminant((*_15)) = 1; // scope 6 at $DIR/inline-generator.rs:15:8: 15:8
|
||||
+ goto -> bb1; // scope 0 at $DIR/inline-generator.rs:15:8: 15:8
|
||||
+ Deinit(_1); // scope 6 at $DIR/inline-generator.rs:15:41: 15:41
|
||||
+ ((_1 as Complete).0: bool) = move _10; // scope 6 at $DIR/inline-generator.rs:15:41: 15:41
|
||||
+ discriminant(_1) = 1; // scope 6 at $DIR/inline-generator.rs:15:41: 15:41
|
||||
+ _15 = deref_copy (_2.0: &mut [generator@$DIR/inline-generator.rs:15:5: 15:8]); // scope 6 at $DIR/inline-generator.rs:15:41: 15:41
|
||||
+ discriminant((*_15)) = 1; // scope 6 at $DIR/inline-generator.rs:15:41: 15:41
|
||||
+ goto -> bb1; // scope 0 at $DIR/inline-generator.rs:15:41: 15:41
|
||||
+ }
|
||||
+
|
||||
+ bb8: {
|
||||
+ assert(const false, "generator resumed after completion") -> [success: bb8, unwind: bb2]; // scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ assert(const false, "generator resumed after completion") -> [success: bb8, unwind: bb2]; // scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
+ }
|
||||
+
|
||||
+ bb9: {
|
||||
+ unreachable; // scope 6 at $DIR/inline-generator.rs:15:5: 15:8
|
||||
+ unreachable; // scope 6 at $DIR/inline-generator.rs:15:5: 15:41
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,20 +3,20 @@
|
|||
fn main::{closure#0}(_1: &[closure@main::{closure#0}], _2: &i32) -> &i32 {
|
||||
debug x => _2; // in scope 0 at $DIR/retag.rs:+0:32: +0:33
|
||||
let mut _0: &i32; // return place in scope 0 at $DIR/retag.rs:+0:44: +0:48
|
||||
let _3: &i32; // in scope 0 at $DIR/retag.rs:42:13: 42:15
|
||||
let _3: &i32; // in scope 0 at $DIR/retag.rs:+1:13: +1:15
|
||||
scope 1 {
|
||||
debug _y => _3; // in scope 1 at $DIR/retag.rs:42:13: 42:15
|
||||
debug _y => _3; // in scope 1 at $DIR/retag.rs:+1:13: +1:15
|
||||
}
|
||||
|
||||
bb0: {
|
||||
Retag([fn entry] _1); // scope 0 at $DIR/retag.rs:+0:31: +0:48
|
||||
Retag([fn entry] _1); // scope 0 at $DIR/retag.rs:+0:31: +3:6
|
||||
Retag([fn entry] _2); // scope 0 at $DIR/retag.rs:+0:32: +0:33
|
||||
StorageLive(_3); // scope 0 at $DIR/retag.rs:42:13: 42:15
|
||||
_3 = _2; // scope 0 at $DIR/retag.rs:42:18: 42:19
|
||||
Retag(_3); // scope 0 at $DIR/retag.rs:42:18: 42:19
|
||||
_0 = _2; // scope 1 at $DIR/retag.rs:43:9: 43:10
|
||||
Retag(_0); // scope 1 at $DIR/retag.rs:43:9: 43:10
|
||||
StorageDead(_3); // scope 0 at $DIR/retag.rs:44:5: 44:6
|
||||
return; // scope 0 at $DIR/retag.rs:+0:48: +0:48
|
||||
StorageLive(_3); // scope 0 at $DIR/retag.rs:+1:13: +1:15
|
||||
_3 = _2; // scope 0 at $DIR/retag.rs:+1:18: +1:19
|
||||
Retag(_3); // scope 0 at $DIR/retag.rs:+1:18: +1:19
|
||||
_0 = _2; // scope 1 at $DIR/retag.rs:+2:9: +2:10
|
||||
Retag(_0); // scope 1 at $DIR/retag.rs:+2:9: +2:10
|
||||
StorageDead(_3); // scope 0 at $DIR/retag.rs:+3:5: +3:6
|
||||
return; // scope 0 at $DIR/retag.rs:+3:6: +3:6
|
||||
}
|
||||
}
|
||||
|
|
|
@ -198,6 +198,6 @@ static XXX: &Foo = {
|
|||
_0 = &(*_1); // scope 0 at $DIR/storage_live_dead_in_statics.rs:+0:28: +18:2
|
||||
StorageDead(_5); // scope 0 at $DIR/storage_live_dead_in_statics.rs:+18:1: +18:2
|
||||
StorageDead(_1); // scope 0 at $DIR/storage_live_dead_in_statics.rs:+18:1: +18:2
|
||||
return; // scope 0 at $DIR/storage_live_dead_in_statics.rs:+0:1: +18:2
|
||||
return; // scope 0 at $DIR/storage_live_dead_in_statics.rs:+0:1: +18:3
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,6 @@ const <impl at $DIR/unusual-item-types.rs:9:1: 9:7>::ASSOCIATED_CONSTANT: i32 =
|
|||
|
||||
bb0: {
|
||||
_0 = const 2_i32; // scope 0 at $DIR/unusual-item-types.rs:+0:38: +0:39
|
||||
return; // scope 0 at $DIR/unusual-item-types.rs:+0:5: +0:39
|
||||
return; // scope 0 at $DIR/unusual-item-types.rs:+0:5: +0:40
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
37| 0| countdown = 10;
|
||||
38| 0| }
|
||||
39| 0| "alt string 2".to_owned()
|
||||
40| | };
|
||||
40| 0| };
|
||||
41| 1| println!(
|
||||
42| 1| "The string or alt: {}"
|
||||
43| 1| ,
|
||||
|
@ -79,7 +79,7 @@
|
|||
79| 0| countdown = 10;
|
||||
80| 1| }
|
||||
81| 1| "alt string 4".to_owned()
|
||||
82| | };
|
||||
82| 1| };
|
||||
83| 1| println!(
|
||||
84| 1| "The string or alt: {}"
|
||||
85| 1| ,
|
||||
|
@ -101,7 +101,7 @@
|
|||
101| 0| countdown = 10;
|
||||
102| 5| }
|
||||
103| 5| format!("'{}'", val)
|
||||
104| | };
|
||||
104| 5| };
|
||||
105| 1| println!(
|
||||
106| 1| "Repeated, quoted string: {:?}"
|
||||
107| 1| ,
|
||||
|
@ -125,7 +125,7 @@
|
|||
125| 0| countdown = 10;
|
||||
126| 0| }
|
||||
127| 0| "closure should be unused".to_owned()
|
||||
128| | };
|
||||
128| 0| };
|
||||
129| |
|
||||
130| 1| let mut countdown = 10;
|
||||
131| 1| let _short_unused_closure = | _unused_arg: u8 | countdown += 1;
|
||||
|
@ -177,7 +177,7 @@
|
|||
173| 0| println!(
|
||||
174| 0| "not called: {}",
|
||||
175| 0| if is_true { "check" } else { "me" }
|
||||
176| | )
|
||||
176| 0| )
|
||||
177| | ;
|
||||
178| |
|
||||
179| 1| let short_used_not_covered_closure_line_break_block_embedded_branch =
|
||||
|
@ -187,7 +187,7 @@
|
|||
183| 0| "not called: {}",
|
||||
184| 0| if is_true { "check" } else { "me" }
|
||||
185| | )
|
||||
186| | }
|
||||
186| 0| }
|
||||
187| | ;
|
||||
188| |
|
||||
189| 1| let short_used_covered_closure_line_break_no_block_embedded_branch =
|
||||
|
@ -196,7 +196,7 @@
|
|||
192| 1| "not called: {}",
|
||||
193| 1| if is_true { "check" } else { "me" }
|
||||
^0
|
||||
194| | )
|
||||
194| 1| )
|
||||
195| | ;
|
||||
196| |
|
||||
197| 1| let short_used_covered_closure_line_break_block_embedded_branch =
|
||||
|
@ -207,7 +207,7 @@
|
|||
202| 1| if is_true { "check" } else { "me" }
|
||||
^0
|
||||
203| | )
|
||||
204| | }
|
||||
204| 1| }
|
||||
205| | ;
|
||||
206| |
|
||||
207| 1| if is_false {
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
17| 1| let mut generator = || {
|
||||
18| 1| yield get_u32(is_true);
|
||||
19| 1| return "foo";
|
||||
20| | };
|
||||
20| 1| };
|
||||
21| |
|
||||
22| 1| match Pin::new(&mut generator).resume(()) {
|
||||
23| 1| GeneratorState::Yielded(Ok(1)) => {}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
6| 1|
|
||||
7| 1| let f = |x: bool| {
|
||||
8| | debug_assert!(
|
||||
9| | x
|
||||
9| 0| x
|
||||
10| | );
|
||||
11| 1| };
|
||||
12| 1| f(false);
|
||||
|
|
|
@ -61,12 +61,12 @@
|
|||
46| 4| println!("used_only_from_this_lib_crate_generic_function with {:?}", arg);
|
||||
47| 4|}
|
||||
------------------
|
||||
| used_inline_crate::used_only_from_this_lib_crate_generic_function::<alloc::vec::Vec<i32>>:
|
||||
| used_inline_crate::used_only_from_this_lib_crate_generic_function::<&str>:
|
||||
| 45| 2|pub fn used_only_from_this_lib_crate_generic_function<T: Debug>(arg: T) {
|
||||
| 46| 2| println!("used_only_from_this_lib_crate_generic_function with {:?}", arg);
|
||||
| 47| 2|}
|
||||
------------------
|
||||
| used_inline_crate::used_only_from_this_lib_crate_generic_function::<&str>:
|
||||
| used_inline_crate::used_only_from_this_lib_crate_generic_function::<alloc::vec::Vec<i32>>:
|
||||
| 45| 2|pub fn used_only_from_this_lib_crate_generic_function<T: Debug>(arg: T) {
|
||||
| 46| 2| println!("used_only_from_this_lib_crate_generic_function with {:?}", arg);
|
||||
| 47| 2|}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
8| 1| let mut generator = || {
|
||||
9| 1| yield 1;
|
||||
10| 1| return "foo"
|
||||
11| | };
|
||||
11| 1| };
|
||||
12| |
|
||||
13| 1| match Pin::new(&mut generator).resume(()) {
|
||||
14| 1| GeneratorState::Yielded(1) => {}
|
||||
|
@ -24,7 +24,7 @@
|
|||
24| 1| yield 2;
|
||||
25| 0| yield 3;
|
||||
26| 0| return "foo"
|
||||
27| | };
|
||||
27| 0| };
|
||||
28| |
|
||||
29| 1| match Pin::new(&mut generator).resume(()) {
|
||||
30| 1| GeneratorState::Yielded(1) => {}
|
||||
|
|
|
@ -2,13 +2,13 @@ error[E0391]: cycle detected when const-evaluating + checking `Tr::A`
|
|||
--> $DIR/defaults-cyclic-fail.rs:5:5
|
||||
|
|
||||
LL | const A: u8 = Self::B;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: ...which requires const-evaluating + checking `Tr::B`...
|
||||
--> $DIR/defaults-cyclic-fail.rs:8:5
|
||||
|
|
||||
LL | const B: u8 = Self::A;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which again requires const-evaluating + checking `Tr::A`, completing the cycle
|
||||
note: cycle used when const-evaluating + checking `main::promoted[1]`
|
||||
--> $DIR/defaults-cyclic-fail.rs:16:16
|
||||
|
|
|
@ -13,7 +13,7 @@ note: ...which requires const-evaluating + checking `IMPL_REF_BAR`...
|
|||
--> $DIR/issue-24949-assoc-const-static-recursion-impl.rs:7:1
|
||||
|
|
||||
LL | const IMPL_REF_BAR: u32 = GlobalImplRef::BAR;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires const-evaluating + checking `<impl at $DIR/issue-24949-assoc-const-static-recursion-impl.rs:11:1: 11:19>::BAR`...
|
||||
--> $DIR/issue-24949-assoc-const-static-recursion-impl.rs:12:5
|
||||
|
|
||||
|
|
|
@ -13,7 +13,7 @@ note: ...which requires const-evaluating + checking `DEFAULT_REF_BAR`...
|
|||
--> $DIR/issue-24949-assoc-const-static-recursion-trait-default.rs:11:1
|
||||
|
|
||||
LL | const DEFAULT_REF_BAR: u32 = <GlobalDefaultRef>::BAR;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires const-evaluating + checking `FooDefault::BAR`...
|
||||
--> $DIR/issue-24949-assoc-const-static-recursion-trait-default.rs:8:5
|
||||
|
|
||||
|
|
|
@ -13,7 +13,7 @@ note: ...which requires const-evaluating + checking `TRAIT_REF_BAR`...
|
|||
--> $DIR/issue-24949-assoc-const-static-recursion-trait.rs:7:1
|
||||
|
|
||||
LL | const TRAIT_REF_BAR: u32 = <GlobalTraitRef>::BAR;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires const-evaluating + checking `<impl at $DIR/issue-24949-assoc-const-static-recursion-trait.rs:11:1: 11:28>::BAR`...
|
||||
--> $DIR/issue-24949-assoc-const-static-recursion-trait.rs:12:5
|
||||
|
|
||||
|
|
|
@ -8,7 +8,7 @@ note: ...which requires const-evaluating + checking `A`...
|
|||
--> $DIR/issue-36163.rs:1:1
|
||||
|
|
||||
LL | const A: isize = Foo::B as isize;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which again requires const-evaluating + checking `Foo::B::{constant#0}`, completing the cycle
|
||||
note: cycle used when simplifying constant for the type system `Foo::B::{constant#0}`
|
||||
--> $DIR/issue-36163.rs:4:9
|
||||
|
|
|
@ -29,6 +29,11 @@ note: ...which requires building MIR for `cycle1`...
|
|||
|
|
||||
LL | fn cycle1() -> impl Clone {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires building THIR for `cycle1`...
|
||||
--> $DIR/auto-trait-leak.rs:12:1
|
||||
|
|
||||
LL | fn cycle1() -> impl Clone {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires type-checking `cycle1`...
|
||||
--> $DIR/auto-trait-leak.rs:14:5
|
||||
|
|
||||
|
@ -65,6 +70,11 @@ note: ...which requires building MIR for `cycle2`...
|
|||
|
|
||||
LL | fn cycle2() -> impl Clone {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires building THIR for `cycle2`...
|
||||
--> $DIR/auto-trait-leak.rs:19:1
|
||||
|
|
||||
LL | fn cycle2() -> impl Clone {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires type-checking `cycle2`...
|
||||
--> $DIR/auto-trait-leak.rs:20:5
|
||||
|
|
||||
|
|
|
@ -2,7 +2,7 @@ error[E0391]: cycle detected when const-evaluating + checking `FOO`
|
|||
--> $DIR/issue-17252.rs:1:1
|
||||
|
|
||||
LL | const FOO: usize = FOO;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: ...which immediately requires const-evaluating + checking `FOO` again
|
||||
note: cycle used when const-evaluating + checking `main::{constant#0}`
|
||||
|
|
|
@ -2,13 +2,13 @@ error[E0391]: cycle detected when const-evaluating + checking `A`
|
|||
--> $DIR/issue-23302-3.rs:1:1
|
||||
|
|
||||
LL | const A: i32 = B;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: ...which requires const-evaluating + checking `B`...
|
||||
--> $DIR/issue-23302-3.rs:3:1
|
||||
|
|
||||
LL | const B: i32 = A;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
= note: ...which again requires const-evaluating + checking `A`, completing the cycle
|
||||
note: cycle used when simplifying constant for the type system `A`
|
||||
--> $DIR/issue-23302-3.rs:1:1
|
||||
|
|
|
@ -22,14 +22,8 @@ LL | let mut closure = expect_sig(|p, y| *p = y);
|
|||
note: no external requirements
|
||||
--> $DIR/escape-argument-callee.rs:20:1
|
||||
|
|
||||
LL | / fn test() {
|
||||
LL | | let x = 44;
|
||||
LL | | let mut p = &x;
|
||||
LL | |
|
||||
... |
|
||||
LL | | deref(p);
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn test() {
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: defining type: test
|
||||
|
||||
|
|
|
@ -13,14 +13,8 @@ LL | let mut closure = expect_sig(|p, y| *p = y);
|
|||
note: no external requirements
|
||||
--> $DIR/escape-argument.rs:20:1
|
||||
|
|
||||
LL | / fn test() {
|
||||
LL | | let x = 44;
|
||||
LL | | let mut p = &x;
|
||||
LL | |
|
||||
... |
|
||||
LL | | deref(p);
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn test() {
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: defining type: test
|
||||
|
||||
|
|
|
@ -29,14 +29,8 @@ LL | let mut closure = || {
|
|||
note: no external requirements
|
||||
--> $DIR/escape-upvar-nested.rs:13:1
|
||||
|
|
||||
LL | / fn test() {
|
||||
LL | | let x = 44;
|
||||
LL | | let mut p = &x;
|
||||
LL | |
|
||||
... |
|
||||
LL | | deref(p);
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn test() {
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: defining type: test
|
||||
|
||||
|
|
|
@ -15,14 +15,8 @@ LL | let mut closure = || p = &y;
|
|||
note: no external requirements
|
||||
--> $DIR/escape-upvar-ref.rs:17:1
|
||||
|
|
||||
LL | / fn test() {
|
||||
LL | | let x = 44;
|
||||
LL | | let mut p = &x;
|
||||
LL | |
|
||||
... |
|
||||
LL | | deref(p);
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn test() {
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: defining type: test
|
||||
|
||||
|
|
|
@ -27,14 +27,8 @@ LL | demand_y(x, y, p)
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-approximated-fail-no-postdom.rs:38:1
|
||||
|
|
||||
LL | / fn supply<'a, 'b, 'c>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>, cell_c: Cell<&'c u32>) {
|
||||
LL | | establish_relationships(
|
||||
LL | | cell_a,
|
||||
LL | | cell_b,
|
||||
... |
|
||||
LL | | );
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn supply<'a, 'b, 'c>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>, cell_c: Cell<&'c u32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: supply
|
||||
|
||||
|
|
|
@ -17,14 +17,8 @@ LL | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-approximated-ref.rs:42:1
|
||||
|
|
||||
LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
LL | | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
|
||||
LL | | // Only works if 'x: 'y:
|
||||
LL | | demand_y(x, y, x.get())
|
||||
LL | |
|
||||
LL | | });
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: supply
|
||||
|
||||
|
|
|
@ -23,14 +23,8 @@ LL | cell_a.set(cell_x.get()); // forces 'x: 'a, error in closure
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:18:1
|
||||
|
|
||||
LL | / fn case1() {
|
||||
LL | | let a = 0;
|
||||
LL | | let cell = Cell::new(&a);
|
||||
LL | | foo(cell, |cell_a, cell_x| {
|
||||
... |
|
||||
LL | | })
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn case1() {
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: case1
|
||||
|
||||
|
@ -51,14 +45,8 @@ LL | foo(cell, |cell_a, cell_x| {
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:28:1
|
||||
|
|
||||
LL | / fn case2() {
|
||||
LL | | let a = 0;
|
||||
LL | | let cell = Cell::new(&a);
|
||||
LL | |
|
||||
... |
|
||||
LL | | })
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn case2() {
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: case2
|
||||
|
||||
|
|
|
@ -17,14 +17,8 @@ LL | establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-approximated-shorter-to-static-no-bound.rs:31:1
|
||||
|
|
||||
LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
LL | | establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
|
||||
LL | |
|
||||
LL | |
|
||||
... |
|
||||
LL | | });
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: supply
|
||||
|
||||
|
|
|
@ -17,14 +17,8 @@ LL | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-approximated-shorter-to-static-wrong-bound.rs:34:1
|
||||
|
|
||||
LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
LL | | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
|
||||
LL | |
|
||||
LL | |
|
||||
... |
|
||||
LL | | });
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: supply
|
||||
|
||||
|
|
|
@ -17,14 +17,8 @@ LL | establish_relationships(cell_a, cell_b, |outlives1, outlives2, x, y| {
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-approximated-val.rs:35:1
|
||||
|
|
||||
LL | / fn test<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
LL | | establish_relationships(cell_a, cell_b, |outlives1, outlives2, x, y| {
|
||||
LL | | // Only works if 'x: 'y:
|
||||
LL | | demand_y(outlives1, outlives2, x.get())
|
||||
LL | |
|
||||
LL | | });
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn test<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: test
|
||||
|
||||
|
|
|
@ -16,14 +16,8 @@ LL | |_outlives1, _outlives2, x, y| {
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-despite-same-free-region.rs:39:1
|
||||
|
|
||||
LL | / fn supply<'a>(cell_a: Cell<&'a u32>) {
|
||||
LL | | establish_relationships(
|
||||
LL | | cell_a,
|
||||
LL | | |_outlives1, _outlives2, x, y| {
|
||||
... |
|
||||
LL | | );
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn supply<'a>(cell_a: Cell<&'a u32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: supply
|
||||
|
||||
|
|
|
@ -26,14 +26,8 @@ LL | demand_y(x, y, x.get())
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-fail-to-approximate-longer-no-bounds.rs:34:1
|
||||
|
|
||||
LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
LL | | establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
|
||||
LL | | // Only works if 'x: 'y:
|
||||
LL | | demand_y(x, y, x.get())
|
||||
LL | |
|
||||
LL | | });
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: supply
|
||||
|
||||
|
|
|
@ -26,14 +26,8 @@ LL | demand_y(x, y, x.get())
|
|||
note: no external requirements
|
||||
--> $DIR/propagate-fail-to-approximate-longer-wrong-bounds.rs:38:1
|
||||
|
|
||||
LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
LL | | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
|
||||
LL | | // Only works if 'x: 'y:
|
||||
LL | | demand_y(x, y, x.get())
|
||||
LL | |
|
||||
LL | | });
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: supply
|
||||
|
||||
|
|
|
@ -18,11 +18,7 @@ note: no external requirements
|
|||
LL | / fn supply<'a, T>(value: T)
|
||||
LL | | where
|
||||
LL | | T: Trait<'a>,
|
||||
LL | | {
|
||||
... |
|
||||
LL | | });
|
||||
LL | | }
|
||||
| |_^
|
||||
| |_________________^
|
||||
|
|
||||
= note: defining type: supply::<'_#1r, T>
|
||||
|
||||
|
|
|
@ -22,11 +22,8 @@ LL | expect_sig(|a, b| b); // ought to return `a`
|
|||
note: no external requirements
|
||||
--> $DIR/return-wrong-bound-region.rs:10:1
|
||||
|
|
||||
LL | / fn test() {
|
||||
LL | | expect_sig(|a, b| b); // ought to return `a`
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn test() {
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: defining type: test
|
||||
|
||||
|
|
|
@ -18,11 +18,7 @@ note: no external requirements
|
|||
LL | / fn no_region<'a, T>(x: Box<T>) -> Box<dyn Anything + 'a>
|
||||
LL | | where
|
||||
LL | | T: Iterator,
|
||||
LL | | {
|
||||
LL | | with_signature(x, |mut y| Box::new(y.next()))
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |________________^
|
||||
|
|
||||
= note: defining type: no_region::<'_#1r, T>
|
||||
|
||||
|
@ -55,10 +51,7 @@ note: no external requirements
|
|||
LL | / fn correct_region<'a, T>(x: Box<T>) -> Box<dyn Anything + 'a>
|
||||
LL | | where
|
||||
LL | | T: 'a + Iterator,
|
||||
LL | | {
|
||||
LL | | with_signature(x, |mut y| Box::new(y.next()))
|
||||
LL | | }
|
||||
| |_^
|
||||
| |_____________________^
|
||||
|
|
||||
= note: defining type: correct_region::<'_#1r, T>
|
||||
|
||||
|
@ -82,11 +75,7 @@ note: no external requirements
|
|||
LL | / fn wrong_region<'a, 'b, T>(x: Box<T>) -> Box<dyn Anything + 'a>
|
||||
LL | | where
|
||||
LL | | T: 'b + Iterator,
|
||||
LL | | {
|
||||
LL | | with_signature(x, |mut y| Box::new(y.next()))
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |_____________________^
|
||||
|
|
||||
= note: defining type: wrong_region::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -120,10 +109,7 @@ LL | / fn outlives_region<'a, 'b, T>(x: Box<T>) -> Box<dyn Anything + 'a>
|
|||
LL | | where
|
||||
LL | | T: 'b + Iterator,
|
||||
LL | | 'b: 'a,
|
||||
LL | | {
|
||||
LL | | with_signature(x, |mut y| Box::new(y.next()))
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: outlives_region::<'_#1r, '_#2r, T>
|
||||
|
||||
|
|
|
@ -20,11 +20,7 @@ note: no external requirements
|
|||
LL | / fn no_relationships_late<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
||||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | {
|
||||
... |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |____________________^
|
||||
|
|
||||
= note: defining type: no_relationships_late::<'_#1r, T>
|
||||
|
||||
|
@ -74,10 +70,7 @@ LL | / fn no_relationships_early<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | 'a: 'a,
|
||||
... |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: no_relationships_early::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -126,10 +119,7 @@ LL | / fn projection_outlives<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | T::AssocType: 'a,
|
||||
... |
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |_____________________^
|
||||
|
|
||||
= note: defining type: projection_outlives::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -155,10 +145,8 @@ LL | / fn elements_outlive<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | T: 'a,
|
||||
... |
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | | 'b: 'a,
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: elements_outlive::<'_#1r, '_#2r, T>
|
||||
|
||||
|
|
|
@ -19,11 +19,7 @@ note: no external requirements
|
|||
LL | / fn no_relationships_late<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
||||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |____________________^
|
||||
|
|
||||
= note: defining type: no_relationships_late::<'_#1r, T>
|
||||
|
||||
|
@ -61,10 +57,7 @@ LL | / fn no_relationships_early<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | 'a: 'a,
|
||||
... |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: no_relationships_early::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -102,10 +95,7 @@ LL | / fn projection_outlives<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | T::AssocType: 'a,
|
||||
... |
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |_____________________^
|
||||
|
|
||||
= note: defining type: projection_outlives::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -130,10 +120,7 @@ LL | / fn elements_outlive<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | 'b: 'a,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: elements_outlive::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -157,11 +144,7 @@ note: no external requirements
|
|||
LL | / fn one_region<'a, T>(cell: Cell<&'a ()>, t: T)
|
||||
LL | | where
|
||||
LL | | T: Anything<'a>,
|
||||
LL | | {
|
||||
... |
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |____________________^
|
||||
|
|
||||
= note: defining type: one_region::<'_#1r, T>
|
||||
|
||||
|
|
|
@ -17,10 +17,7 @@ note: no external requirements
|
|||
LL | / fn no_relationships_late<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
||||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |____________________^
|
||||
|
|
||||
= note: defining type: no_relationships_late::<'_#1r, T>
|
||||
|
||||
|
@ -43,10 +40,7 @@ LL | / fn no_relationships_early<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | 'a: 'a,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: no_relationships_early::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -69,10 +63,7 @@ LL | / fn projection_outlives<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | T::AssocType: 'a,
|
||||
... |
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |_____________________^
|
||||
|
|
||||
= note: defining type: projection_outlives::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -95,10 +86,7 @@ LL | / fn elements_outlive<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b>,
|
||||
LL | | 'b: 'a,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: elements_outlive::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -120,11 +108,7 @@ note: no external requirements
|
|||
LL | / fn one_region<'a, T>(cell: Cell<&'a ()>, t: T)
|
||||
LL | | where
|
||||
LL | | T: Anything<'a>,
|
||||
LL | | {
|
||||
... |
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |____________________^
|
||||
|
|
||||
= note: defining type: one_region::<'_#1r, T>
|
||||
|
||||
|
|
|
@ -19,11 +19,7 @@ note: no external requirements
|
|||
LL | / fn no_relationships_late<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T)
|
||||
LL | | where
|
||||
LL | | T: Anything<'b, 'c>,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |________________________^
|
||||
|
|
||||
= note: defining type: no_relationships_late::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -57,10 +53,7 @@ LL | / fn no_relationships_early<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b, 'c>,
|
||||
LL | | 'a: 'a,
|
||||
... |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: no_relationships_early::<'_#1r, '_#2r, '_#3r, T>
|
||||
|
||||
|
@ -94,10 +87,7 @@ LL | / fn projection_outlives<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b, 'c>,
|
||||
LL | | T::AssocType: 'a,
|
||||
... |
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |_____________________^
|
||||
|
|
||||
= note: defining type: projection_outlives::<'_#1r, '_#2r, '_#3r, T>
|
||||
|
||||
|
@ -122,10 +112,7 @@ LL | / fn elements_outlive1<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b, 'c>,
|
||||
LL | | 'b: 'a,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: elements_outlive1::<'_#1r, '_#2r, '_#3r, T>
|
||||
|
||||
|
@ -150,10 +137,7 @@ LL | / fn elements_outlive2<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b, 'c>,
|
||||
LL | | 'c: 'a,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: elements_outlive2::<'_#1r, '_#2r, '_#3r, T>
|
||||
|
||||
|
@ -178,11 +162,7 @@ note: no external requirements
|
|||
LL | / fn two_regions<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
||||
LL | | where
|
||||
LL | | T: Anything<'b, 'b>,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |________________________^
|
||||
|
|
||||
= note: defining type: two_regions::<'_#1r, T>
|
||||
|
||||
|
@ -220,10 +200,7 @@ LL | / fn two_regions_outlive<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
|
|||
LL | | where
|
||||
LL | | T: Anything<'b, 'b>,
|
||||
LL | | 'b: 'a,
|
||||
LL | | {
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: two_regions_outlive::<'_#1r, '_#2r, T>
|
||||
|
||||
|
@ -247,11 +224,7 @@ note: no external requirements
|
|||
LL | / fn one_region<'a, T>(cell: Cell<&'a ()>, t: T)
|
||||
LL | | where
|
||||
LL | | T: Anything<'a, 'a>,
|
||||
LL | | {
|
||||
... |
|
||||
LL | | with_signature(cell, t, |cell, t| require(cell, t));
|
||||
LL | | }
|
||||
| |_^
|
||||
| |________________________^
|
||||
|
|
||||
= note: defining type: one_region::<'_#1r, T>
|
||||
|
||||
|
|
|
@ -15,11 +15,8 @@ LL | twice(cell, value, |a, b| invoke(a, b));
|
|||
note: no external requirements
|
||||
--> $DIR/ty-param-closure-approximate-lower-bound.rs:22:1
|
||||
|
|
||||
LL | / fn generic<T>(value: T) {
|
||||
LL | | let cell = Cell::new(&());
|
||||
LL | | twice(cell, value, |a, b| invoke(a, b));
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn generic<T>(value: T) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: generic::<T>
|
||||
|
||||
|
@ -41,11 +38,8 @@ LL | twice(cell, value, |a, b| invoke(a, b));
|
|||
note: no external requirements
|
||||
--> $DIR/ty-param-closure-approximate-lower-bound.rs:28:1
|
||||
|
|
||||
LL | / fn generic_fail<'a, T>(cell: Cell<&'a ()>, value: T) {
|
||||
LL | | twice(cell, value, |a, b| invoke(a, b));
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn generic_fail<'a, T>(cell: Cell<&'a ()>, value: T) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: generic_fail::<T>
|
||||
|
||||
|
|
|
@ -18,11 +18,7 @@ note: no external requirements
|
|||
LL | / fn no_region<'a, T>(x: Box<T>) -> Box<dyn Debug + 'a>
|
||||
LL | | where
|
||||
LL | | T: Debug,
|
||||
LL | | {
|
||||
... |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| |_____________^
|
||||
|
|
||||
= note: defining type: no_region::<'_#1r, T>
|
||||
|
||||
|
|
|
@ -16,14 +16,8 @@ LL | with_signature(a, b, |x, y| {
|
|||
note: no external requirements
|
||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:26:1
|
||||
|
|
||||
LL | / fn no_region<'a, T>(a: Cell<&'a ()>, b: T) {
|
||||
LL | | with_signature(a, b, |x, y| {
|
||||
LL | |
|
||||
LL | | //
|
||||
... |
|
||||
LL | | })
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn no_region<'a, T>(a: Cell<&'a ()>, b: T) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: defining type: no_region::<T>
|
||||
|
||||
|
@ -65,11 +59,7 @@ note: no external requirements
|
|||
LL | / fn correct_region<'a, T>(a: Cell<&'a ()>, b: T)
|
||||
LL | | where
|
||||
LL | | T: 'a,
|
||||
LL | | {
|
||||
... |
|
||||
LL | | })
|
||||
LL | | }
|
||||
| |_^
|
||||
| |__________^
|
||||
|
|
||||
= note: defining type: correct_region::<'_#1r, T>
|
||||
|
||||
|
@ -94,11 +84,7 @@ note: no external requirements
|
|||
LL | / fn wrong_region<'a, 'b, T>(a: Cell<&'a ()>, b: T)
|
||||
LL | | where
|
||||
LL | | T: 'b,
|
||||
LL | | {
|
||||
... |
|
||||
LL | | })
|
||||
LL | | }
|
||||
| |_^
|
||||
| |__________^
|
||||
|
|
||||
= note: defining type: wrong_region::<'_#1r, T>
|
||||
|
||||
|
@ -139,10 +125,7 @@ LL | / fn outlives_region<'a, 'b, T>(a: Cell<&'a ()>, b: T)
|
|||
LL | | where
|
||||
LL | | T: 'b,
|
||||
LL | | 'b: 'a,
|
||||
... |
|
||||
LL | | })
|
||||
LL | | }
|
||||
| |_^
|
||||
| |___________^
|
||||
|
|
||||
= note: defining type: outlives_region::<'_#1r, '_#2r, T>
|
||||
|
||||
|
|
|
@ -30,14 +30,15 @@ error[E0597]: `c` does not live long enough
|
|||
|
|
||||
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | let _closure = || {
|
||||
| - `c` dropped here while still borrowed
|
||||
...
|
||||
LL | SomeEnum::SomeVariant(Cell::new(&c)),
|
||||
| ----------^^-
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| argument requires that `c` is borrowed for `'a`
|
||||
...
|
||||
LL | };
|
||||
| - `c` dropped here while still borrowed
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
@ -28,28 +28,28 @@ error[E0597]: `c` does not live long enough
|
|||
|
|
||||
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | let _closure = || {
|
||||
| - `c` dropped here while still borrowed
|
||||
...
|
||||
LL | f(&c);
|
||||
| --^^-
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| argument requires that `c` is borrowed for `'a`
|
||||
LL | };
|
||||
| - `c` dropped here while still borrowed
|
||||
|
||||
error[E0597]: `c` does not live long enough
|
||||
--> $DIR/adt-tuple-struct-calls.rs:53:11
|
||||
|
|
||||
LL | let f = SomeStruct::<&'a u32>;
|
||||
| - lifetime `'1` appears in the type of `f`
|
||||
LL | let _closure = || {
|
||||
| - `c` dropped here while still borrowed
|
||||
LL | let c = 66;
|
||||
...
|
||||
LL | f(&c);
|
||||
| --^^-
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| argument requires that `c` is borrowed for `'1`
|
||||
LL | };
|
||||
| - `c` dropped here while still borrowed
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
|
|
|
@ -28,14 +28,14 @@ error[E0597]: `c` does not live long enough
|
|||
|
|
||||
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | let _closure = || {
|
||||
| - `c` dropped here while still borrowed
|
||||
LL | let c = 66;
|
||||
...
|
||||
LL | some_fn::<&'a u32>(&c);
|
||||
| -------------------^^-
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| argument requires that `c` is borrowed for `'a`
|
||||
LL | };
|
||||
| - `c` dropped here while still borrowed
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
@ -29,14 +29,13 @@ error[E0597]: `c` does not live long enough
|
|||
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
|
||||
| -- lifetime `'a` defined here
|
||||
...
|
||||
LL | let _closure = || {
|
||||
| - `c` dropped here while still borrowed
|
||||
LL | let c = 66;
|
||||
LL | a.method::<&'a u32>(b, &c);
|
||||
| ------------------------^^-
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| argument requires that `c` is borrowed for `'a`
|
||||
LL | };
|
||||
| - `c` dropped here while still borrowed
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
@ -29,14 +29,13 @@ error[E0597]: `c` does not live long enough
|
|||
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
|
||||
| -- lifetime `'a` defined here
|
||||
...
|
||||
LL | let _closure = || {
|
||||
| - `c` dropped here while still borrowed
|
||||
LL | let c = 66;
|
||||
LL | <_ as Bazoom<_>>::method::<&'a u32>(&a, b, &c);
|
||||
| -------------------------------------------^^-
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| argument requires that `c` is borrowed for `'a`
|
||||
LL | };
|
||||
| - `c` dropped here while still borrowed
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
@ -71,9 +71,8 @@ error[E0382]: use of moved value
|
|||
--> $DIR/borrowck-move-and-move.rs:22:12
|
||||
|
|
||||
LL | fn fun(a @ b: U) {}
|
||||
| ^----
|
||||
| | |
|
||||
| | value moved here
|
||||
| ^ - value moved here
|
||||
| |
|
||||
| value used here after move
|
||||
| move occurs because value has type `U`, which does not implement the `Copy` trait
|
||||
|
||||
|
|
|
@ -314,9 +314,8 @@ error[E0382]: borrow of moved value
|
|||
--> $DIR/borrowck-pat-by-move-and-ref.rs:11:11
|
||||
|
|
||||
LL | fn f1(ref a @ b: U) {}
|
||||
| ^^^^^----
|
||||
| | |
|
||||
| | value moved here
|
||||
| ^^^^^ - value moved here
|
||||
| |
|
||||
| value borrowed here after move
|
||||
| move occurs because value has type `U`, which does not implement the `Copy` trait
|
||||
|
||||
|
|
|
@ -434,9 +434,8 @@ error[E0382]: borrow of moved value
|
|||
--> $DIR/borrowck-pat-ref-mut-and-ref.rs:28:30
|
||||
|
|
||||
LL | fn f4_also_moved(ref a @ ref mut b @ c: U) {}
|
||||
| --------^^^^^^^^^----
|
||||
| | | |
|
||||
| | | value moved here
|
||||
| ----- ^^^^^^^^^ - value moved here
|
||||
| | |
|
||||
| | value borrowed here after move
|
||||
| move occurs because value has type `U`, which does not implement the `Copy` trait
|
||||
|
||||
|
|
|
@ -328,9 +328,8 @@ error[E0382]: borrow of moved value
|
|||
--> $DIR/borrowck-pat-ref-mut-twice.rs:21:34
|
||||
|
|
||||
LL | fn f4_also_moved(ref mut a @ ref mut b @ c: U) {}
|
||||
| ------------^^^^^^^^^----
|
||||
| | | |
|
||||
| | | value moved here
|
||||
| --------- ^^^^^^^^^ - value moved here
|
||||
| | |
|
||||
| | value borrowed here after move
|
||||
| move occurs because value has type `U`, which does not implement the `Copy` trait
|
||||
|
||||
|
|
|
@ -54,5 +54,6 @@ Thir {
|
|||
},
|
||||
],
|
||||
stmts: [],
|
||||
params: [],
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue