Use let_else in even more places
This commit is contained in:
parent
9ad5d82f82
commit
b2dd1377c7
@ -1493,7 +1493,7 @@ fn generator_layout_and_saved_local_names<'tcx>(
|
||||
|
||||
let state_arg = mir::Local::new(1);
|
||||
for var in &body.var_debug_info {
|
||||
let place = if let mir::VarDebugInfoContents::Place(p) = var.value { p } else { continue };
|
||||
let mir::VarDebugInfoContents::Place(place) = &var.value else { continue };
|
||||
if place.local != state_arg {
|
||||
continue;
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(let_else)]
|
||||
#![feature(extern_types)]
|
||||
#![feature(nll)]
|
||||
#![recursion_limit = "256"]
|
||||
|
@ -1,5 +1,6 @@
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(let_else)]
|
||||
#![feature(internal_output_capture)]
|
||||
#![feature(thread_spawn_unchecked)]
|
||||
#![feature(nll)]
|
||||
|
@ -717,57 +717,57 @@ fn run<R, F: FnOnce(&mut Self) -> R>(&mut self, is_const: bool, action: F) -> R
|
||||
}
|
||||
|
||||
fn should_ignore_fn(ret_ty: &ast::FnRetTy) -> bool {
|
||||
if let ast::FnRetTy::Ty(ref ty) = ret_ty {
|
||||
fn involves_impl_trait(ty: &ast::Ty) -> bool {
|
||||
match ty.kind {
|
||||
ast::TyKind::ImplTrait(..) => true,
|
||||
ast::TyKind::Slice(ref subty)
|
||||
| ast::TyKind::Array(ref subty, _)
|
||||
| ast::TyKind::Ptr(ast::MutTy { ty: ref subty, .. })
|
||||
| ast::TyKind::Rptr(_, ast::MutTy { ty: ref subty, .. })
|
||||
| ast::TyKind::Paren(ref subty) => involves_impl_trait(subty),
|
||||
ast::TyKind::Tup(ref tys) => any_involves_impl_trait(tys.iter()),
|
||||
ast::TyKind::Path(_, ref path) => {
|
||||
path.segments.iter().any(|seg| match seg.args.as_deref() {
|
||||
None => false,
|
||||
Some(&ast::GenericArgs::AngleBracketed(ref data)) => {
|
||||
data.args.iter().any(|arg| match arg {
|
||||
ast::AngleBracketedArg::Arg(arg) => match arg {
|
||||
ast::GenericArg::Type(ty) => involves_impl_trait(ty),
|
||||
ast::GenericArg::Lifetime(_)
|
||||
| ast::GenericArg::Const(_) => false,
|
||||
},
|
||||
ast::AngleBracketedArg::Constraint(c) => match c.kind {
|
||||
ast::AssocConstraintKind::Bound { .. } => true,
|
||||
ast::AssocConstraintKind::Equality { ref term } => {
|
||||
match term {
|
||||
Term::Ty(ty) => involves_impl_trait(ty),
|
||||
// FIXME(...): This should check if the constant
|
||||
// involves a trait impl, but for now ignore.
|
||||
Term::Const(_) => false,
|
||||
}
|
||||
let ast::FnRetTy::Ty(ref ty) = ret_ty else {
|
||||
return false;
|
||||
};
|
||||
fn involves_impl_trait(ty: &ast::Ty) -> bool {
|
||||
match ty.kind {
|
||||
ast::TyKind::ImplTrait(..) => true,
|
||||
ast::TyKind::Slice(ref subty)
|
||||
| ast::TyKind::Array(ref subty, _)
|
||||
| ast::TyKind::Ptr(ast::MutTy { ty: ref subty, .. })
|
||||
| ast::TyKind::Rptr(_, ast::MutTy { ty: ref subty, .. })
|
||||
| ast::TyKind::Paren(ref subty) => involves_impl_trait(subty),
|
||||
ast::TyKind::Tup(ref tys) => any_involves_impl_trait(tys.iter()),
|
||||
ast::TyKind::Path(_, ref path) => {
|
||||
path.segments.iter().any(|seg| match seg.args.as_deref() {
|
||||
None => false,
|
||||
Some(&ast::GenericArgs::AngleBracketed(ref data)) => {
|
||||
data.args.iter().any(|arg| match arg {
|
||||
ast::AngleBracketedArg::Arg(arg) => match arg {
|
||||
ast::GenericArg::Type(ty) => involves_impl_trait(ty),
|
||||
ast::GenericArg::Lifetime(_) | ast::GenericArg::Const(_) => {
|
||||
false
|
||||
}
|
||||
},
|
||||
ast::AngleBracketedArg::Constraint(c) => match c.kind {
|
||||
ast::AssocConstraintKind::Bound { .. } => true,
|
||||
ast::AssocConstraintKind::Equality { ref term } => {
|
||||
match term {
|
||||
Term::Ty(ty) => involves_impl_trait(ty),
|
||||
// FIXME(...): This should check if the constant
|
||||
// involves a trait impl, but for now ignore.
|
||||
Term::Const(_) => false,
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
Some(&ast::GenericArgs::Parenthesized(ref data)) => {
|
||||
any_involves_impl_trait(data.inputs.iter())
|
||||
|| ReplaceBodyWithLoop::should_ignore_fn(&data.output)
|
||||
}
|
||||
})
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
Some(&ast::GenericArgs::Parenthesized(ref data)) => {
|
||||
any_involves_impl_trait(data.inputs.iter())
|
||||
|| ReplaceBodyWithLoop::should_ignore_fn(&data.output)
|
||||
}
|
||||
})
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
|
||||
fn any_involves_impl_trait<'a, I: Iterator<Item = &'a P<ast::Ty>>>(mut it: I) -> bool {
|
||||
it.any(|subty| involves_impl_trait(subty))
|
||||
}
|
||||
|
||||
involves_impl_trait(ty)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
||||
fn any_involves_impl_trait<'a, I: Iterator<Item = &'a P<ast::Ty>>>(mut it: I) -> bool {
|
||||
it.any(|subty| involves_impl_trait(subty))
|
||||
}
|
||||
|
||||
involves_impl_trait(ty)
|
||||
}
|
||||
|
||||
fn is_sig_const(sig: &ast::FnSig) -> bool {
|
||||
|
@ -1328,23 +1328,22 @@ fn test_candidates_with_or(
|
||||
|
||||
let mut otherwise = None;
|
||||
for match_pair in match_pairs {
|
||||
if let PatKind::Or { ref pats } = *match_pair.pattern.kind {
|
||||
let or_span = match_pair.pattern.span;
|
||||
let place = match_pair.place;
|
||||
|
||||
first_candidate.visit_leaves(|leaf_candidate| {
|
||||
self.test_or_pattern(
|
||||
leaf_candidate,
|
||||
&mut otherwise,
|
||||
pats,
|
||||
or_span,
|
||||
place.clone(),
|
||||
fake_borrows,
|
||||
);
|
||||
});
|
||||
} else {
|
||||
let PatKind::Or { ref pats } = &*match_pair.pattern.kind else {
|
||||
bug!("Or-patterns should have been sorted to the end");
|
||||
}
|
||||
};
|
||||
let or_span = match_pair.pattern.span;
|
||||
let place = match_pair.place;
|
||||
|
||||
first_candidate.visit_leaves(|leaf_candidate| {
|
||||
self.test_or_pattern(
|
||||
leaf_candidate,
|
||||
&mut otherwise,
|
||||
pats,
|
||||
or_span,
|
||||
place.clone(),
|
||||
fake_borrows,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
let remainder_start = otherwise.unwrap_or_else(|| self.cfg.start_new_block());
|
||||
|
@ -88,11 +88,8 @@ pub(super) fn add_cases_to_switch<'pat>(
|
||||
switch_ty: Ty<'tcx>,
|
||||
options: &mut FxIndexMap<&'tcx ty::Const<'tcx>, u128>,
|
||||
) -> bool {
|
||||
let match_pair = match candidate.match_pairs.iter().find(|mp| mp.place == *test_place) {
|
||||
Some(match_pair) => match_pair,
|
||||
_ => {
|
||||
return false;
|
||||
}
|
||||
let Some(match_pair) = candidate.match_pairs.iter().find(|mp| mp.place == *test_place) else {
|
||||
return false;
|
||||
};
|
||||
|
||||
match *match_pair.pattern.kind {
|
||||
|
@ -1162,9 +1162,7 @@ fn smart_resolve_context_dependent_help(
|
||||
ident: Symbol,
|
||||
kind: &AssocItemKind,
|
||||
) -> Option<Symbol> {
|
||||
let module = if let Some((module, _)) = self.current_trait_ref {
|
||||
module
|
||||
} else {
|
||||
let Some((module, _)) = &self.current_trait_ref else {
|
||||
return None;
|
||||
};
|
||||
if ident == kw::Underscore {
|
||||
|
@ -1000,46 +1000,45 @@ fn visit_ty(&mut self, ty: &'tcx hir::Ty<'tcx>) {
|
||||
// `fn foo<'a>() -> MyAnonTy<'a> { ... }`
|
||||
// ^ ^this gets resolved in the current scope
|
||||
for lifetime in lifetimes {
|
||||
if let hir::GenericArg::Lifetime(lifetime) = lifetime {
|
||||
self.visit_lifetime(lifetime);
|
||||
let hir::GenericArg::Lifetime(lifetime) = lifetime else {
|
||||
continue
|
||||
};
|
||||
self.visit_lifetime(lifetime);
|
||||
|
||||
// Check for predicates like `impl for<'a> Trait<impl OtherTrait<'a>>`
|
||||
// and ban them. Type variables instantiated inside binders aren't
|
||||
// well-supported at the moment, so this doesn't work.
|
||||
// In the future, this should be fixed and this error should be removed.
|
||||
let def = self.map.defs.get(&lifetime.hir_id).cloned();
|
||||
if let Some(Region::LateBound(_, _, def_id, _)) = def {
|
||||
if let Some(def_id) = def_id.as_local() {
|
||||
let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
// Ensure that the parent of the def is an item, not HRTB
|
||||
let parent_id = self.tcx.hir().get_parent_node(hir_id);
|
||||
// FIXME(cjgillot) Can this check be replaced by
|
||||
// `let parent_is_item = parent_id.is_owner();`?
|
||||
let parent_is_item =
|
||||
if let Some(parent_def_id) = parent_id.as_owner() {
|
||||
matches!(
|
||||
self.tcx.hir().krate().owners.get(parent_def_id),
|
||||
Some(Some(_)),
|
||||
)
|
||||
} else {
|
||||
false
|
||||
};
|
||||
// Check for predicates like `impl for<'a> Trait<impl OtherTrait<'a>>`
|
||||
// and ban them. Type variables instantiated inside binders aren't
|
||||
// well-supported at the moment, so this doesn't work.
|
||||
// In the future, this should be fixed and this error should be removed.
|
||||
let def = self.map.defs.get(&lifetime.hir_id).cloned();
|
||||
let Some(Region::LateBound(_, _, def_id, _)) = def else {
|
||||
continue
|
||||
};
|
||||
let Some(def_id) = def_id.as_local() else {
|
||||
continue
|
||||
};
|
||||
let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
// Ensure that the parent of the def is an item, not HRTB
|
||||
let parent_id = self.tcx.hir().get_parent_node(hir_id);
|
||||
// FIXME(cjgillot) Can this check be replaced by
|
||||
// `let parent_is_item = parent_id.is_owner();`?
|
||||
let parent_is_item = if let Some(parent_def_id) = parent_id.as_owner() {
|
||||
matches!(self.tcx.hir().krate().owners.get(parent_def_id), Some(Some(_)),)
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
if !parent_is_item {
|
||||
if !self.trait_definition_only {
|
||||
struct_span_err!(
|
||||
self.tcx.sess,
|
||||
lifetime.span,
|
||||
E0657,
|
||||
"`impl Trait` can only capture lifetimes \
|
||||
bound at the fn or impl level"
|
||||
)
|
||||
.emit();
|
||||
}
|
||||
self.uninsert_lifetime_on_error(lifetime, def.unwrap());
|
||||
}
|
||||
}
|
||||
if !parent_is_item {
|
||||
if !self.trait_definition_only {
|
||||
struct_span_err!(
|
||||
self.tcx.sess,
|
||||
lifetime.span,
|
||||
E0657,
|
||||
"`impl Trait` can only capture lifetimes \
|
||||
bound at the fn or impl level"
|
||||
)
|
||||
.emit();
|
||||
}
|
||||
self.uninsert_lifetime_on_error(lifetime, def.unwrap());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -840,39 +840,38 @@ fn suggest_remove_reference(
|
||||
};
|
||||
|
||||
for refs_remaining in 0..refs_number {
|
||||
if let ty::Ref(_, inner_ty, _) = suggested_ty.kind() {
|
||||
suggested_ty = inner_ty;
|
||||
let ty::Ref(_, inner_ty, _) = suggested_ty.kind() else {
|
||||
break;
|
||||
};
|
||||
suggested_ty = inner_ty;
|
||||
|
||||
let new_obligation = self.mk_trait_obligation_with_new_self_ty(
|
||||
obligation.param_env,
|
||||
trait_ref,
|
||||
suggested_ty,
|
||||
let new_obligation = self.mk_trait_obligation_with_new_self_ty(
|
||||
obligation.param_env,
|
||||
trait_ref,
|
||||
suggested_ty,
|
||||
);
|
||||
|
||||
if self.predicate_may_hold(&new_obligation) {
|
||||
let sp = self
|
||||
.tcx
|
||||
.sess
|
||||
.source_map()
|
||||
.span_take_while(span, |c| c.is_whitespace() || *c == '&');
|
||||
|
||||
let remove_refs = refs_remaining + 1;
|
||||
|
||||
let msg = if remove_refs == 1 {
|
||||
"consider removing the leading `&`-reference".to_string()
|
||||
} else {
|
||||
format!("consider removing {} leading `&`-references", remove_refs)
|
||||
};
|
||||
|
||||
err.span_suggestion_short(
|
||||
sp,
|
||||
&msg,
|
||||
String::new(),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
|
||||
if self.predicate_may_hold(&new_obligation) {
|
||||
let sp = self
|
||||
.tcx
|
||||
.sess
|
||||
.source_map()
|
||||
.span_take_while(span, |c| c.is_whitespace() || *c == '&');
|
||||
|
||||
let remove_refs = refs_remaining + 1;
|
||||
|
||||
let msg = if remove_refs == 1 {
|
||||
"consider removing the leading `&`-reference".to_string()
|
||||
} else {
|
||||
format!("consider removing {} leading `&`-references", remove_refs)
|
||||
};
|
||||
|
||||
err.span_suggestion_short(
|
||||
sp,
|
||||
&msg,
|
||||
String::new(),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user