mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-11 08:05:12 +00:00
rustc: remove HirId
from ArgSource::AsyncFn
This commit removes the `HirId` from `ArgSource::AsyncFn`, relying on the fact that only `simple_ident` is used in each of the locations that previously took the original pattern from the `ArgSource::AsyncFn`.
This commit is contained in:
parent
1e5f496143
commit
5e3b41e0cb
@ -3092,7 +3092,7 @@ impl<'a> LoweringContext<'a> {
|
|||||||
new_argument_id, ident, None),
|
new_argument_id, ident, None),
|
||||||
span: desugared_span,
|
span: desugared_span,
|
||||||
}),
|
}),
|
||||||
source: hir::ArgSource::AsyncFn(argument.pat.hir_id),
|
source: hir::ArgSource::AsyncFn,
|
||||||
};
|
};
|
||||||
|
|
||||||
let construct_stmt = |this: &mut LoweringContext<'_>, pat: P<hir::Pat>,
|
let construct_stmt = |this: &mut LoweringContext<'_>, pat: P<hir::Pat>,
|
||||||
|
@ -699,19 +699,6 @@ impl<'hir> Map<'hir> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the `HirId` of this pattern, or, if this is an `async fn` desugaring, the `HirId`
|
|
||||||
/// of the original pattern that the user wrote.
|
|
||||||
pub fn original_pat_of_argument(&self, arg: &'hir Arg) -> &'hir Pat {
|
|
||||||
match &arg.source {
|
|
||||||
ArgSource::Normal => &*arg.pat,
|
|
||||||
ArgSource::AsyncFn(hir_id) => match self.find_by_hir_id(*hir_id) {
|
|
||||||
Some(Node::Pat(pat)) | Some(Node::Binding(pat)) => &pat,
|
|
||||||
Some(Node::Local(local)) => &*local.pat,
|
|
||||||
x => bug!("ArgSource::AsyncFn HirId not a pattern/binding/local: {:?}", x),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_const_scope(&self, hir_id: HirId) -> bool {
|
pub fn is_const_scope(&self, hir_id: HirId) -> bool {
|
||||||
self.walk_parent_nodes(hir_id, |node| match *node {
|
self.walk_parent_nodes(hir_id, |node| match *node {
|
||||||
Node::Item(Item { node: ItemKind::Const(_, _), .. }) => true,
|
Node::Item(Item { node: ItemKind::Const(_, _), .. }) => true,
|
||||||
|
@ -1937,8 +1937,8 @@ pub struct Arg {
|
|||||||
pub enum ArgSource {
|
pub enum ArgSource {
|
||||||
/// Argument as specified by the user.
|
/// Argument as specified by the user.
|
||||||
Normal,
|
Normal,
|
||||||
/// Generated argument from `async fn` lowering, `HirId` is the original pattern.
|
/// Generated argument from `async fn` lowering.
|
||||||
AsyncFn(HirId),
|
AsyncFn,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents the header (not the body) of a function declaration.
|
/// Represents the header (not the body) of a function declaration.
|
||||||
|
@ -86,14 +86,12 @@ impl<'a, 'gcx, 'tcx> NiceRegionError<'a, 'gcx, 'tcx> {
|
|||||||
let sub_is_ret_type =
|
let sub_is_ret_type =
|
||||||
self.is_return_type_anon(scope_def_id_sub, bregion_sub, ty_fndecl_sub);
|
self.is_return_type_anon(scope_def_id_sub, bregion_sub, ty_fndecl_sub);
|
||||||
|
|
||||||
let arg_sup_pat = self.tcx().hir().original_pat_of_argument(anon_arg_sup);
|
let span_label_var1 = match anon_arg_sup.pat.simple_ident() {
|
||||||
let span_label_var1 = match arg_sup_pat.simple_ident() {
|
|
||||||
Some(simple_ident) => format!(" from `{}`", simple_ident),
|
Some(simple_ident) => format!(" from `{}`", simple_ident),
|
||||||
None => String::new(),
|
None => String::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let arg_sub_pat = self.tcx().hir().original_pat_of_argument(anon_arg_sub);
|
let span_label_var2 = match anon_arg_sub.pat.simple_ident() {
|
||||||
let span_label_var2 = match arg_sub_pat.simple_ident() {
|
|
||||||
Some(simple_ident) => format!(" into `{}`", simple_ident),
|
Some(simple_ident) => format!(" into `{}`", simple_ident),
|
||||||
None => String::new(),
|
None => String::new(),
|
||||||
};
|
};
|
||||||
|
@ -95,8 +95,7 @@ impl<'a, 'gcx, 'tcx> NiceRegionError<'a, 'gcx, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let arg_pat = self.tcx().hir().original_pat_of_argument(arg);
|
let (error_var, span_label_var) = match arg.pat.simple_ident() {
|
||||||
let (error_var, span_label_var) = match arg_pat.simple_ident() {
|
|
||||||
Some(simple_ident) => (
|
Some(simple_ident) => (
|
||||||
format!("the type of `{}`", simple_ident),
|
format!("the type of `{}`", simple_ident),
|
||||||
format!("the type of `{}`", simple_ident),
|
format!("the type of `{}`", simple_ident),
|
||||||
|
@ -2414,10 +2414,10 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
|||||||
have_bound_regions,
|
have_bound_regions,
|
||||||
} = info;
|
} = info;
|
||||||
|
|
||||||
let help_name = if let Some(body) = parent {
|
let help_name = if let Some(ident) = parent.and_then(|body| {
|
||||||
let arg = &self.tcx.hir().body(body).arguments[index];
|
self.tcx.hir().body(body).arguments[index].pat.simple_ident()
|
||||||
let original_pat = self.tcx.hir().original_pat_of_argument(arg);
|
}) {
|
||||||
format!("`{}`", self.tcx.hir().hir_to_pretty_string(original_pat.hir_id))
|
format!("`{}`", ident)
|
||||||
} else {
|
} else {
|
||||||
format!("argument {}", index + 1)
|
format!("argument {}", index + 1)
|
||||||
};
|
};
|
||||||
|
@ -84,23 +84,11 @@ pub fn mir_build<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> Body<'
|
|||||||
// HACK(eddyb) Avoid having RustCall on closures,
|
// HACK(eddyb) Avoid having RustCall on closures,
|
||||||
// as it adds unnecessary (and wrong) auto-tupling.
|
// as it adds unnecessary (and wrong) auto-tupling.
|
||||||
abi = Abi::Rust;
|
abi = Abi::Rust;
|
||||||
Some(ArgInfo {
|
Some(ArgInfo(liberated_closure_env_ty(tcx, id, body_id), None, None, None))
|
||||||
ty: liberated_closure_env_ty(tcx, id, body_id),
|
|
||||||
span: None,
|
|
||||||
pattern: None,
|
|
||||||
user_pattern: None,
|
|
||||||
self_kind: None,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
ty::Generator(..) => {
|
ty::Generator(..) => {
|
||||||
let gen_ty = tcx.body_tables(body_id).node_type(id);
|
let gen_ty = tcx.body_tables(body_id).node_type(id);
|
||||||
Some(ArgInfo {
|
Some(ArgInfo(gen_ty, None, None, None))
|
||||||
ty: gen_ty,
|
|
||||||
span: None,
|
|
||||||
pattern: None,
|
|
||||||
user_pattern: None,
|
|
||||||
self_kind: None,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
@ -139,14 +127,7 @@ pub fn mir_build<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> Body<'
|
|||||||
self_arg = None;
|
self_arg = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let original_pat = tcx.hir().original_pat_of_argument(arg);
|
ArgInfo(fn_sig.inputs()[index], opt_ty_info, Some(&*arg.pat), self_arg)
|
||||||
ArgInfo {
|
|
||||||
ty: fn_sig.inputs()[index],
|
|
||||||
span: opt_ty_info,
|
|
||||||
pattern: Some(&*arg.pat),
|
|
||||||
user_pattern: Some(&original_pat),
|
|
||||||
self_kind: self_arg,
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let arguments = implicit_argument.into_iter().chain(explicit_arguments);
|
let arguments = implicit_argument.into_iter().chain(explicit_arguments);
|
||||||
@ -634,13 +615,7 @@ fn should_abort_on_panic<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
/// the main entry point for building MIR for a function
|
/// the main entry point for building MIR for a function
|
||||||
|
|
||||||
struct ArgInfo<'gcx> {
|
struct ArgInfo<'gcx>(Ty<'gcx>, Option<Span>, Option<&'gcx hir::Pat>, Option<ImplicitSelfKind>);
|
||||||
ty: Ty<'gcx>,
|
|
||||||
span: Option<Span>,
|
|
||||||
pattern: Option<&'gcx hir::Pat>,
|
|
||||||
user_pattern: Option<&'gcx hir::Pat>,
|
|
||||||
self_kind: Option<ImplicitSelfKind>,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>,
|
fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>,
|
||||||
fn_id: hir::HirId,
|
fn_id: hir::HirId,
|
||||||
@ -901,18 +876,13 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
|||||||
-> BlockAnd<()>
|
-> BlockAnd<()>
|
||||||
{
|
{
|
||||||
// Allocate locals for the function arguments
|
// Allocate locals for the function arguments
|
||||||
for &ArgInfo { ty, span: _, pattern, user_pattern, self_kind: _ } in arguments.iter() {
|
for &ArgInfo(ty, _, pattern, _) in arguments.iter() {
|
||||||
// If this is a simple binding pattern, give the local a name for
|
// If this is a simple binding pattern, give the local a name for
|
||||||
// debuginfo and so that error reporting knows that this is a user
|
// debuginfo and so that error reporting knows that this is a user
|
||||||
// variable. For any other pattern the pattern introduces new
|
// variable. For any other pattern the pattern introduces new
|
||||||
// variables which will be named instead.
|
// variables which will be named instead.
|
||||||
let (name, span) = if let Some(pat) = user_pattern {
|
let (name, span) = if let Some(pat) = pattern {
|
||||||
match pat.node {
|
(pat.simple_ident().map(|ident| ident.name), pat.span)
|
||||||
hir::PatKind::Binding(hir::BindingAnnotation::Unannotated, _, ident, _)
|
|
||||||
| hir::PatKind::Binding(hir::BindingAnnotation::Mutable, _, ident, _) =>
|
|
||||||
(Some(ident.name), pat.span),
|
|
||||||
_ => (None, pattern.map_or(self.fn_span, |pat| pat.span))
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
(None, self.fn_span)
|
(None, self.fn_span)
|
||||||
};
|
};
|
||||||
@ -937,13 +907,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
|||||||
// Function arguments always get the first Local indices after the return place
|
// Function arguments always get the first Local indices after the return place
|
||||||
let local = Local::new(index + 1);
|
let local = Local::new(index + 1);
|
||||||
let place = Place::Base(PlaceBase::Local(local));
|
let place = Place::Base(PlaceBase::Local(local));
|
||||||
let &ArgInfo {
|
let &ArgInfo(ty, opt_ty_info, pattern, ref self_binding) = arg_info;
|
||||||
ty,
|
|
||||||
span: opt_ty_info,
|
|
||||||
pattern,
|
|
||||||
user_pattern: _,
|
|
||||||
self_kind: ref self_binding
|
|
||||||
} = arg_info;
|
|
||||||
|
|
||||||
// Make sure we drop (parts of) the argument even when not matched on.
|
// Make sure we drop (parts of) the argument even when not matched on.
|
||||||
self.schedule_drop(
|
self.schedule_drop(
|
||||||
@ -958,7 +922,13 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
|||||||
|
|
||||||
match *pattern.kind {
|
match *pattern.kind {
|
||||||
// Don't introduce extra copies for simple bindings
|
// Don't introduce extra copies for simple bindings
|
||||||
PatternKind::Binding { mutability, var, mode: BindingMode::ByValue, .. } => {
|
PatternKind::Binding {
|
||||||
|
mutability,
|
||||||
|
var,
|
||||||
|
mode: BindingMode::ByValue,
|
||||||
|
subpattern: None,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
self.local_decls[local].mutability = mutability;
|
self.local_decls[local].mutability = mutability;
|
||||||
self.local_decls[local].is_user_variable =
|
self.local_decls[local].is_user_variable =
|
||||||
if let Some(kind) = self_binding {
|
if let Some(kind) = self_binding {
|
||||||
|
@ -2018,9 +2018,8 @@ impl<'a> Clean<Arguments> for (&'a [hir::Ty], hir::BodyId) {
|
|||||||
|
|
||||||
Arguments {
|
Arguments {
|
||||||
values: self.0.iter().enumerate().map(|(i, ty)| {
|
values: self.0.iter().enumerate().map(|(i, ty)| {
|
||||||
let original_pat = cx.tcx.hir().original_pat_of_argument(&body.arguments[i]);
|
|
||||||
Argument {
|
Argument {
|
||||||
name: name_from_pat(original_pat),
|
name: name_from_pat(&body.arguments[i].pat),
|
||||||
type_: ty.clean(cx),
|
type_: ty.clean(cx),
|
||||||
}
|
}
|
||||||
}).collect()
|
}).collect()
|
||||||
|
@ -30,7 +30,7 @@ error[E0106]: missing lifetime specifier
|
|||||||
LL | fn foo2(_: &'_ u8, y: &'_ u8) -> &'_ u8 { y }
|
LL | fn foo2(_: &'_ u8, y: &'_ u8) -> &'_ u8 { y }
|
||||||
| ^^ expected lifetime parameter
|
| ^^ expected lifetime parameter
|
||||||
|
|
|
|
||||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `_` or `y`
|
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or `y`
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user