Adopt let_else in even more places

This commit is contained in:
est31 2022-02-15 05:58:25 +01:00
parent 3cfa4def7c
commit 60f969a4f2
26 changed files with 50 additions and 104 deletions

View File

@ -142,11 +142,9 @@ trait TypeOpInfo<'tcx> {
let tcx = mbcx.infcx.tcx; let tcx = mbcx.infcx.tcx;
let base_universe = self.base_universe(); let base_universe = self.base_universe();
let adjusted_universe = if let Some(adjusted) = let Some(adjusted_universe) =
placeholder.universe.as_u32().checked_sub(base_universe.as_u32()) placeholder.universe.as_u32().checked_sub(base_universe.as_u32())
{ else {
adjusted
} else {
mbcx.buffer_error(self.fallback_error(tcx, cause.span)); mbcx.buffer_error(self.fallback_error(tcx, cause.span));
return; return;
}; };

View File

@ -892,15 +892,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
kind: TerminatorKind::Call { fn_span, from_hir_call, .. }, .. kind: TerminatorKind::Call { fn_span, from_hir_call, .. }, ..
}) = &self.body[location.block].terminator }) = &self.body[location.block].terminator
{ {
let (method_did, method_substs) = if let Some(info) = let Some((method_did, method_substs)) =
rustc_const_eval::util::find_self_call( rustc_const_eval::util::find_self_call(
self.infcx.tcx, self.infcx.tcx,
&self.body, &self.body,
target_temp, target_temp,
location.block, location.block,
) { )
info else {
} else {
return normal_ret; return normal_ret;
}; };

View File

@ -639,11 +639,9 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
let hir_map = self.infcx.tcx.hir(); let hir_map = self.infcx.tcx.hir();
let my_def = self.body.source.def_id(); let my_def = self.body.source.def_id();
let my_hir = hir_map.local_def_id_to_hir_id(my_def.as_local().unwrap()); let my_hir = hir_map.local_def_id_to_hir_id(my_def.as_local().unwrap());
let td = if let Some(a) = let Some(td) =
self.infcx.tcx.impl_of_method(my_def).and_then(|x| self.infcx.tcx.trait_id_of_impl(x)) self.infcx.tcx.impl_of_method(my_def).and_then(|x| self.infcx.tcx.trait_id_of_impl(x))
{ else {
a
} else {
return (false, None); return (false, None);
}; };
( (

View File

@ -6,9 +6,7 @@ use rustc_expand::base::{self, DummyResult};
/// Emits errors for literal expressions that are invalid inside and outside of an array. /// Emits errors for literal expressions that are invalid inside and outside of an array.
fn invalid_type_err(cx: &mut base::ExtCtxt<'_>, expr: &P<rustc_ast::Expr>, is_nested: bool) { fn invalid_type_err(cx: &mut base::ExtCtxt<'_>, expr: &P<rustc_ast::Expr>, is_nested: bool) {
let lit = if let ast::ExprKind::Lit(lit) = &expr.kind { let ast::ExprKind::Lit(lit) = &expr.kind else {
lit
} else {
unreachable!(); unreachable!();
}; };
match lit.kind { match lit.kind {

View File

@ -9,6 +9,7 @@
#![feature(decl_macro)] #![feature(decl_macro)]
#![feature(is_sorted)] #![feature(is_sorted)]
#![feature(nll)] #![feature(nll)]
#![feature(let_else)]
#![feature(proc_macro_internals)] #![feature(proc_macro_internals)]
#![feature(proc_macro_quote)] #![feature(proc_macro_quote)]
#![recursion_limit = "256"] #![recursion_limit = "256"]

View File

@ -216,17 +216,18 @@ pub fn each_linked_rlib(
} }
let name = &info.crate_name[&cnum]; let name = &info.crate_name[&cnum];
let used_crate_source = &info.used_crate_source[&cnum]; let used_crate_source = &info.used_crate_source[&cnum];
let path = if let Some((path, _)) = &used_crate_source.rlib { if let Some((path, _)) = &used_crate_source.rlib {
path f(cnum, &path);
} else if used_crate_source.rmeta.is_some() {
return Err(format!(
"could not find rlib for: `{}`, found rmeta (metadata) file",
name
));
} else { } else {
return Err(format!("could not find rlib for: `{}`", name)); if used_crate_source.rmeta.is_some() {
}; return Err(format!(
f(cnum, &path); "could not find rlib for: `{}`, found rmeta (metadata) file",
name
));
} else {
return Err(format!("could not find rlib for: `{}`", name));
}
}
} }
Ok(()) Ok(())
} }

View File

@ -200,9 +200,7 @@ fn create_object_file(sess: &Session) -> Option<write::Object<'static>> {
// `SHF_EXCLUDE` flag we can set on sections in an object file to get // `SHF_EXCLUDE` flag we can set on sections in an object file to get
// automatically removed from the final output. // automatically removed from the final output.
pub fn create_rmeta_file(sess: &Session, metadata: &[u8]) -> Vec<u8> { pub fn create_rmeta_file(sess: &Session, metadata: &[u8]) -> Vec<u8> {
let mut file = if let Some(file) = create_object_file(sess) { let Some(mut file) = create_object_file(sess) else {
file
} else {
// This is used to handle all "other" targets. This includes targets // This is used to handle all "other" targets. This includes targets
// in two categories: // in two categories:
// //
@ -262,9 +260,7 @@ pub fn create_compressed_metadata_file(
) -> Vec<u8> { ) -> Vec<u8> {
let mut compressed = rustc_metadata::METADATA_HEADER.to_vec(); let mut compressed = rustc_metadata::METADATA_HEADER.to_vec();
FrameEncoder::new(&mut compressed).write_all(metadata.raw_data()).unwrap(); FrameEncoder::new(&mut compressed).write_all(metadata.raw_data()).unwrap();
let mut file = if let Some(file) = create_object_file(sess) { let Some(mut file) = create_object_file(sess) else {
file
} else {
return compressed.to_vec(); return compressed.to_vec();
}; };
let section = file.add_section( let section = file.add_section(

View File

@ -852,11 +852,7 @@ impl<T: Idx> HybridBitSet<T> {
Bound::Excluded(end) => end.index(), Bound::Excluded(end) => end.index(),
Bound::Unbounded => self.domain_size() - 1, Bound::Unbounded => self.domain_size() - 1,
}; };
let len = if let Some(l) = end.checked_sub(start) { let Some(len) = end.checked_sub(start) else { return };
l
} else {
return;
};
match self { match self {
HybridBitSet::Sparse(sparse) if sparse.len() + len < SPARSE_MAX => { HybridBitSet::Sparse(sparse) if sparse.len() + len < SPARSE_MAX => {
// The set is sparse and has space for `elems`. // The set is sparse and has space for `elems`.

View File

@ -553,8 +553,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
let ty_msg = match (local_visitor.found_node_ty, local_visitor.found_exact_method_call) { let ty_msg = match (local_visitor.found_node_ty, local_visitor.found_exact_method_call) {
(_, Some(_)) => String::new(), (_, Some(_)) => String::new(),
(Some(ty), _) if ty.is_closure() => { (Some(ty), _) if ty.is_closure() => {
let substs = let ty::Closure(_, substs) = *ty.kind() else { unreachable!() };
if let ty::Closure(_, substs) = *ty.kind() { substs } else { unreachable!() };
let fn_sig = substs.as_closure().sig(); let fn_sig = substs.as_closure().sig();
let args = closure_args(&fn_sig); let args = closure_args(&fn_sig);
let ret = fn_sig.output().skip_binder().to_string(); let ret = fn_sig.output().skip_binder().to_string();
@ -597,8 +596,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
let param_type = arg_data.kind.descr(); let param_type = arg_data.kind.descr();
let suffix = match local_visitor.found_node_ty { let suffix = match local_visitor.found_node_ty {
Some(ty) if ty.is_closure() => { Some(ty) if ty.is_closure() => {
let substs = let ty::Closure(_, substs) = *ty.kind() else { unreachable!() };
if let ty::Closure(_, substs) = *ty.kind() { substs } else { unreachable!() };
let fn_sig = substs.as_closure().sig(); let fn_sig = substs.as_closure().sig();
let ret = fn_sig.output().skip_binder().to_string(); let ret = fn_sig.output().skip_binder().to_string();

View File

@ -982,7 +982,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
for local_id in hir.iter_local_def_id() { for local_id in hir.iter_local_def_id() {
let def_id = local_id.to_def_id(); let def_id = local_id.to_def_id();
let def_kind = tcx.opt_def_kind(local_id); let def_kind = tcx.opt_def_kind(local_id);
let def_kind = if let Some(def_kind) = def_kind { def_kind } else { continue }; let Some(def_kind) = def_kind else { continue };
record!(self.tables.def_kind[def_id] <- match def_kind { record!(self.tables.def_kind[def_id] <- match def_kind {
// Replace Ctor by the enclosing object to avoid leaking details in children crates. // Replace Ctor by the enclosing object to avoid leaking details in children crates.
DefKind::Ctor(CtorOf::Struct, _) => DefKind::Struct, DefKind::Ctor(CtorOf::Struct, _) => DefKind::Struct,

View File

@ -61,7 +61,7 @@ impl rustc_query_system::dep_graph::DepKind for DepKind {
OP: for<'a> FnOnce(TaskDepsRef<'a>), OP: for<'a> FnOnce(TaskDepsRef<'a>),
{ {
ty::tls::with_context_opt(|icx| { ty::tls::with_context_opt(|icx| {
let icx = if let Some(icx) = icx { icx } else { return }; let Some(icx) = icx else { return };
op(icx.task_deps) op(icx.task_deps)
}) })
} }

View File

@ -1241,9 +1241,7 @@ impl<'tcx> MirPass<'tcx> for StateTransform {
} }
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
let yield_ty = if let Some(yield_ty) = body.yield_ty() { let Some(yield_ty) = body.yield_ty() else {
yield_ty
} else {
// This only applies to generators // This only applies to generators
return; return;
}; };

View File

@ -211,12 +211,7 @@ fn normalize_array_len_call<'tcx>(
let Some(local) = place.as_local() else { return }; let Some(local) = place.as_local() else { return };
match operand { match operand {
Operand::Copy(place) | Operand::Move(place) => { Operand::Copy(place) | Operand::Move(place) => {
let operand_local = let Some(operand_local) = place.local_or_deref_local() else { return; };
if let Some(local) = place.local_or_deref_local() {
local
} else {
return;
};
if !interesting_locals.contains(operand_local) { if !interesting_locals.contains(operand_local) {
return; return;
} }

View File

@ -947,9 +947,7 @@ fn visit_instance_use<'tcx>(
/// Returns `true` if we should codegen an instance in the local crate, or returns `false` if we /// Returns `true` if we should codegen an instance in the local crate, or returns `false` if we
/// can just link to the upstream crate and therefore don't need a mono item. /// can just link to the upstream crate and therefore don't need a mono item.
fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: &Instance<'tcx>) -> bool { fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: &Instance<'tcx>) -> bool {
let def_id = if let Some(def_id) = instance.def.def_id_if_not_guaranteed_local_codegen() { let Some(def_id) = instance.def.def_id_if_not_guaranteed_local_codegen() else {
def_id
} else {
return true; return true;
}; };

View File

@ -8,13 +8,11 @@ use std::io::prelude::*;
/// During the same compile all closures dump the information in the same file /// During the same compile all closures dump the information in the same file
/// "closure_profile_XXXXX.csv", which is created in the directory where the compiler is invoked. /// "closure_profile_XXXXX.csv", which is created in the directory where the compiler is invoked.
crate fn dump_closure_profile<'tcx>(tcx: TyCtxt<'tcx>, closure_instance: Instance<'tcx>) { crate fn dump_closure_profile<'tcx>(tcx: TyCtxt<'tcx>, closure_instance: Instance<'tcx>) {
let mut file = if let Ok(file) = OpenOptions::new() let Ok(mut file) = OpenOptions::new()
.create(true) .create(true)
.append(true) .append(true)
.open(&format!("closure_profile_{}.csv", std::process::id())) .open(&format!("closure_profile_{}.csv", std::process::id()))
{ else {
file
} else {
eprintln!("Cound't open file for writing closure profile"); eprintln!("Cound't open file for writing closure profile");
return; return;
}; };

View File

@ -158,9 +158,7 @@ impl<'a> StringReader<'a> {
Some(match token { Some(match token {
rustc_lexer::TokenKind::LineComment { doc_style } => { rustc_lexer::TokenKind::LineComment { doc_style } => {
// Skip non-doc comments // Skip non-doc comments
let doc_style = if let Some(doc_style) = doc_style { let Some(doc_style) = doc_style else {
doc_style
} else {
self.lint_unicode_text_flow(start); self.lint_unicode_text_flow(start);
return None; return None;
}; };
@ -185,9 +183,7 @@ impl<'a> StringReader<'a> {
} }
// Skip non-doc comments // Skip non-doc comments
let doc_style = if let Some(doc_style) = doc_style { let Some(doc_style) = doc_style else {
doc_style
} else {
self.lint_unicode_text_flow(start); self.lint_unicode_text_flow(start);
return None; return None;
}; };

View File

@ -4,6 +4,7 @@
#![feature(crate_visibility_modifier)] #![feature(crate_visibility_modifier)]
#![feature(if_let_guard)] #![feature(if_let_guard)]
#![feature(box_patterns)] #![feature(box_patterns)]
#![feature(let_else)]
#![recursion_limit = "256"] #![recursion_limit = "256"]
#[macro_use] #[macro_use]

View File

@ -704,7 +704,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
) = &bounded_ty.kind ) = &bounded_ty.kind
{ {
// use this to verify that ident is a type param. // use this to verify that ident is a type param.
let partial_res = if let Ok(Some(partial_res)) = self.resolve_qpath_anywhere( let Ok(Some(partial_res)) = self.resolve_qpath_anywhere(
bounded_ty.id, bounded_ty.id,
None, None,
&Segment::from_path(path), &Segment::from_path(path),
@ -712,9 +712,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
span, span,
true, true,
CrateLint::No, CrateLint::No,
) { ) else {
partial_res
} else {
return false; return false;
}; };
if !(matches!( if !(matches!(
@ -731,7 +729,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
if let ast::TyKind::Path(None, type_param_path) = &ty.peel_refs().kind { if let ast::TyKind::Path(None, type_param_path) = &ty.peel_refs().kind {
// Confirm that the `SelfTy` is a type parameter. // Confirm that the `SelfTy` is a type parameter.
let partial_res = if let Ok(Some(partial_res)) = self.resolve_qpath_anywhere( let Ok(Some(partial_res)) = self.resolve_qpath_anywhere(
bounded_ty.id, bounded_ty.id,
None, None,
&Segment::from_path(type_param_path), &Segment::from_path(type_param_path),
@ -739,9 +737,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
span, span,
true, true,
CrateLint::No, CrateLint::No,
) { ) else {
partial_res
} else {
return false; return false;
}; };
if !(matches!( if !(matches!(

View File

@ -1099,9 +1099,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
_ => return false, _ => return false,
}; };
let ret_ty = if let hir::FnRetTy::Return(ret_ty) = sig.decl.output { let hir::FnRetTy::Return(ret_ty) = sig.decl.output else {
ret_ty
} else {
return false; return false;
}; };
@ -1168,7 +1166,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
}; };
let sm = self.tcx.sess.source_map(); let sm = self.tcx.sess.source_map();
let snippet = if let (true, hir::TyKind::TraitObject(..), Ok(snippet), true) = ( let (true, hir::TyKind::TraitObject(..), Ok(snippet), true) = (
// Verify that we're dealing with a return `dyn Trait` // Verify that we're dealing with a return `dyn Trait`
ret_ty.span.overlaps(span), ret_ty.span.overlaps(span),
&ret_ty.kind, &ret_ty.kind,
@ -1176,9 +1174,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
// If any of the return types does not conform to the trait, then we can't // If any of the return types does not conform to the trait, then we can't
// suggest `impl Trait` nor trait objects: it is a type mismatch error. // suggest `impl Trait` nor trait objects: it is a type mismatch error.
all_returns_conform_to_trait, all_returns_conform_to_trait,
) { ) else {
snippet
} else {
return false; return false;
}; };
err.code(error_code!(E0746)); err.code(error_code!(E0746));

View File

@ -1318,10 +1318,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
base_expr: &'tcx Option<&'tcx hir::Expr<'tcx>>, base_expr: &'tcx Option<&'tcx hir::Expr<'tcx>>,
) -> Ty<'tcx> { ) -> Ty<'tcx> {
// Find the relevant variant // Find the relevant variant
let (variant, adt_ty) = if let Some(variant_ty) = self.check_struct_path(qpath, expr.hir_id) let Some((variant, adt_ty)) = self.check_struct_path(qpath, expr.hir_id) else {
{
variant_ty
} else {
self.check_struct_fields_on_error(fields, base_expr); self.check_struct_fields_on_error(fields, base_expr);
return self.tcx.ty_error(); return self.tcx.ty_error();
}; };

View File

@ -51,9 +51,7 @@ crate fn where_clauses(cx: &DocContext<'_>, clauses: Vec<WP>) -> Vec<WP> {
// Look for equality predicates on associated types that can be merged into // Look for equality predicates on associated types that can be merged into
// general bound predicates // general bound predicates
equalities.retain(|&(ref lhs, ref rhs)| { equalities.retain(|&(ref lhs, ref rhs)| {
let (self_, trait_did, name) = if let Some(p) = lhs.projection() { let Some((self_, trait_did, name)) = lhs.projection() else {
p
} else {
return true; return true;
}; };
let generic = match self_ { let generic = match self_ {

View File

@ -236,9 +236,7 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for CodeBlocks<'_, 'a, I> {
let should_panic; let should_panic;
let ignore; let ignore;
let edition; let edition;
let kind = if let Some(Event::Start(Tag::CodeBlock(kind))) = event { let Some(Event::Start(Tag::CodeBlock(kind))) = event else {
kind
} else {
return event; return event;
}; };

View File

@ -1752,9 +1752,7 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
<ul>", <ul>",
); );
let adt = if let Adt(adt, _) = ty_layout.ty.kind() { let Adt(adt, _) = ty_layout.ty.kind() else {
adt
} else {
span_bug!(tcx.def_span(ty_def_id), "not an adt") span_bug!(tcx.def_span(ty_def_id), "not an adt")
}; };

View File

@ -1226,9 +1226,7 @@ impl LinkCollector<'_, '_> {
let base_node = let base_node =
if item.is_mod() && inner_docs { self.mod_ids.last().copied() } else { parent_node }; if item.is_mod() && inner_docs { self.mod_ids.last().copied() } else { parent_node };
let mut module_id = if let Some(id) = base_node { let Some(mut module_id) = base_node else {
id
} else {
// This is a bug. // This is a bug.
debug!("attempting to resolve item without parent module: {}", path_str); debug!("attempting to resolve item without parent module: {}", path_str);
resolution_failure( resolution_failure(
@ -1977,9 +1975,7 @@ fn resolution_failure(
// If so, report it and say the first which failed; if not, say the first path segment didn't resolve. // If so, report it and say the first which failed; if not, say the first path segment didn't resolve.
let mut name = path_str; let mut name = path_str;
'outer: loop { 'outer: loop {
let (start, end) = if let Some(x) = split(name) { let Some((start, end)) = split(name) else {
x
} else {
// avoid bug that marked [Quux::Z] as missing Z, not Quux // avoid bug that marked [Quux::Z] as missing Z, not Quux
if partial_res.is_none() { if partial_res.is_none() {
*unresolved = name.into(); *unresolved = name.into();

View File

@ -152,9 +152,7 @@ where
} }
hir::ExprKind::MethodCall(_, _, span) => { hir::ExprKind::MethodCall(_, _, span) => {
let types = tcx.typeck(ex.hir_id.owner); let types = tcx.typeck(ex.hir_id.owner);
let def_id = if let Some(def_id) = types.type_dependent_def_id(ex.hir_id) { let Some(def_id) = types.type_dependent_def_id(ex.hir_id) else {
def_id
} else {
trace!("type_dependent_def_id({}) = None", ex.hir_id); trace!("type_dependent_def_id({}) = None", ex.hir_id);
return; return;
}; };

View File

@ -188,9 +188,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
debug!("maybe_inline_local res: {:?}", res); debug!("maybe_inline_local res: {:?}", res);
let tcx = self.cx.tcx; let tcx = self.cx.tcx;
let res_did = if let Some(did) = res.opt_def_id() { let Some(res_did) = res.opt_def_id() else {
did
} else {
return false; return false;
}; };