Skip to content

Commit 1af55d1

Browse files
committed
Auto merge of #89933 - est31:let_else, r=michaelwoerister
Adopt let_else across the compiler This performs a substitution of code following the pattern: ``` let <id> = if let <pat> = ... { identity } else { ... : ! }; ``` To simplify it to: ``` let <pat> = ... { identity } else { ... : ! }; ``` By adopting the `let_else` feature (cc #87335). The PR also updates the syn crate because the currently used version of the crate doesn't support `let_else` syntax yet. Note: Generally I'm the person who *removes* usages of unstable features from the compiler, not adds more usages of them, but in this instance I think it hopefully helps the feature get stabilized sooner and in a better state. I have written a [comment](#87335 (comment)) on the tracking issue about my experience and what I feel could be improved before stabilization of `let_else`.
2 parents c2452de + ef018be commit 1af55d1

File tree

54 files changed

+76
-150
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+76
-150
lines changed

Cargo.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -2728,9 +2728,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
27282728

27292729
[[package]]
27302730
name = "proc-macro2"
2731-
version = "1.0.24"
2731+
version = "1.0.30"
27322732
source = "registry+https://github.com/rust-lang/crates.io-index"
2733-
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
2733+
checksum = "edc3358ebc67bc8b7fa0c007f945b0b18226f78437d61bec735a9eb96b61ee70"
27342734
dependencies = [
27352735
"unicode-xid",
27362736
]
@@ -5093,9 +5093,9 @@ dependencies = [
50935093

50945094
[[package]]
50955095
name = "syn"
5096-
version = "1.0.65"
5096+
version = "1.0.80"
50975097
source = "registry+https://github.com/rust-lang/crates.io-index"
5098-
checksum = "f3a1d708c221c5a612956ef9f75b37e454e88d1f7b899fbd3a18d4252012d663"
5098+
checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194"
50995099
dependencies = [
51005100
"proc-macro2",
51015101
"quote",

compiler/rustc_borrowck/src/borrow_set.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,7 @@ impl<'a, 'tcx> GatherBorrows<'a, 'tcx> {
315315
// TEMP = &foo
316316
//
317317
// so extract `temp`.
318-
let temp = if let Some(temp) = assigned_place.as_local() {
319-
temp
320-
} else {
318+
let Some(temp) = assigned_place.as_local() else {
321319
span_bug!(
322320
self.body.source_info(start_location).span,
323321
"expected 2-phase borrow to assign to a local, not `{:?}`",

compiler/rustc_borrowck/src/diagnostics/outlives_suggestion.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@ impl OutlivesSuggestionBuilder {
9090
let mut unified_already = FxHashSet::default();
9191

9292
for (fr, outlived) in &self.constraints_to_add {
93-
let fr_name = if let Some(fr_name) = self.region_vid_to_name(mbcx, *fr) {
94-
fr_name
95-
} else {
93+
let Some(fr_name) = self.region_vid_to_name(mbcx, *fr) else {
9694
continue;
9795
};
9896

compiler/rustc_borrowck/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#![feature(format_args_capture)]
88
#![feature(in_band_lifetimes)]
99
#![feature(iter_zip)]
10+
#![feature(let_else)]
1011
#![feature(min_specialization)]
1112
#![feature(stmt_expr_attributes)]
1213
#![feature(trusted_step)]

compiler/rustc_codegen_ssa/src/back/link.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,8 @@ pub fn each_linked_rlib(
174174
_ => {}
175175
}
176176
}
177-
let fmts = match fmts {
178-
Some(f) => f,
179-
None => return Err("could not find formats for rlibs".to_string()),
177+
let Some(fmts) = fmts else {
178+
return Err("could not find formats for rlibs".to_string());
180179
};
181180
for &cnum in crates {
182181
match fmts.get(cnum.as_usize() - 1) {

compiler/rustc_codegen_ssa/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#![feature(box_patterns)]
44
#![feature(try_blocks)]
55
#![feature(in_band_lifetimes)]
6+
#![feature(let_else)]
67
#![feature(once_cell)]
78
#![feature(nll)]
89
#![feature(associated_type_bounds)]

compiler/rustc_codegen_ssa/src/mir/operand.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -343,9 +343,7 @@ impl<'a, 'tcx, V: CodegenObject> OperandValue<V> {
343343
.unwrap_or_else(|| bug!("indirect_dest has non-pointer type: {:?}", indirect_dest))
344344
.ty;
345345

346-
let (llptr, llextra) = if let OperandValue::Ref(llptr, Some(llextra), _) = self {
347-
(llptr, llextra)
348-
} else {
346+
let OperandValue::Ref(llptr, Some(llextra), _) = self else {
349347
bug!("store_unsized called with a sized value")
350348
};
351349

compiler/rustc_const_eval/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Rust MIR: a lowered representation of Rust.
1313
#![feature(exact_size_is_empty)]
1414
#![feature(in_band_lifetimes)]
1515
#![feature(iter_zip)]
16+
#![feature(let_else)]
1617
#![feature(map_try_insert)]
1718
#![feature(min_specialization)]
1819
#![feature(slice_ptr_get)]

compiler/rustc_const_eval/src/transform/check_consts/qualifs.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,7 @@ impl Qualif for NeedsNonConstDrop {
145145
Ok([..]) => {}
146146
}
147147

148-
let drop_trait = if let Some(did) = cx.tcx.lang_items().drop_trait() {
149-
did
150-
} else {
148+
let Some(drop_trait) = cx.tcx.lang_items().drop_trait() else {
151149
// there is no way to define a type that needs non-const drop
152150
// without having the lang item present.
153151
return false;

compiler/rustc_errors/src/emitter.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -449,11 +449,7 @@ pub trait Emitter {
449449
span: &mut MultiSpan,
450450
children: &mut Vec<SubDiagnostic>,
451451
) {
452-
let source_map = if let Some(ref sm) = source_map {
453-
sm
454-
} else {
455-
return;
456-
};
452+
let Some(source_map) = source_map else { return };
457453
debug!("fix_multispans_in_extern_macros: before: span={:?} children={:?}", span, children);
458454
self.fix_multispan_in_extern_macros(source_map, span);
459455
for child in children.iter_mut() {

compiler/rustc_errors/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#![feature(if_let_guard)]
99
#![feature(format_args_capture)]
1010
#![feature(iter_zip)]
11+
#![feature(let_else)]
1112
#![feature(nll)]
1213

1314
#[macro_use]

compiler/rustc_expand/src/expand.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -447,9 +447,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
447447
let mut undetermined_invocations = Vec::new();
448448
let (mut progress, mut force) = (false, !self.monotonic);
449449
loop {
450-
let (invoc, ext) = if let Some(invoc) = invocations.pop() {
451-
invoc
452-
} else {
450+
let Some((invoc, ext)) = invocations.pop() else {
453451
self.resolve_imports();
454452
if undetermined_invocations.is_empty() {
455453
break;

compiler/rustc_expand/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#![feature(format_args_capture)]
55
#![feature(if_let_guard)]
66
#![feature(iter_zip)]
7+
#![feature(let_else)]
78
#![feature(proc_macro_diagnostic)]
89
#![feature(proc_macro_internals)]
910
#![feature(proc_macro_span)]

compiler/rustc_expand/src/mbe/transcribe.rs

+3-7
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,8 @@ pub(super) fn transcribe<'a>(
116116

117117
loop {
118118
// Look at the last frame on the stack.
119-
let tree = if let Some(tree) = stack.last_mut().unwrap().next() {
120-
// If it still has a TokenTree we have not looked at yet, use that tree.
121-
tree
122-
} else {
119+
// If it still has a TokenTree we have not looked at yet, use that tree.
120+
let Some(tree) = stack.last_mut().unwrap().next() else {
123121
// This else-case never produces a value for `tree` (it `continue`s or `return`s).
124122

125123
// Otherwise, if we have just reached the end of a sequence and we can keep repeating,
@@ -190,9 +188,7 @@ pub(super) fn transcribe<'a>(
190188
LockstepIterSize::Constraint(len, _) => {
191189
// We do this to avoid an extra clone above. We know that this is a
192190
// sequence already.
193-
let (sp, seq) = if let mbe::TokenTree::Sequence(sp, seq) = seq {
194-
(sp, seq)
195-
} else {
191+
let mbe::TokenTree::Sequence(sp, seq) = seq else {
196192
unreachable!()
197193
};
198194

compiler/rustc_incremental/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
44
#![feature(in_band_lifetimes)]
5+
#![feature(let_else)]
56
#![feature(nll)]
67
#![recursion_limit = "256"]
78

compiler/rustc_incremental/src/persist/fs.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,7 @@ pub fn prepare_session_directory(
241241
// have already tried before.
242242
let source_directory = find_source_directory(&crate_dir, &source_directories_already_tried);
243243

244-
let source_directory = if let Some(dir) = source_directory {
245-
dir
246-
} else {
244+
let Some(source_directory) = source_directory else {
247245
// There's nowhere to copy from, we're done
248246
debug!(
249247
"no source directory found. Continuing with empty session \
@@ -397,15 +395,14 @@ fn copy_files(sess: &Session, target_dir: &Path, source_dir: &Path) -> Result<bo
397395
// We acquire a shared lock on the lock file of the directory, so that
398396
// nobody deletes it out from under us while we are reading from it.
399397
let lock_file_path = lock_file_path(source_dir);
400-
let _lock = if let Ok(lock) = flock::Lock::new(
398+
399+
// not exclusive
400+
let Ok(_lock) = flock::Lock::new(
401401
&lock_file_path,
402402
false, // don't wait,
403403
false, // don't create
404404
false,
405-
) {
406-
// not exclusive
407-
lock
408-
} else {
405+
) else {
409406
// Could not acquire the lock, don't try to copy from here
410407
return Err(());
411408
};

compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,7 @@ pub fn suggest_new_region_bound(
263263
match fn_return.kind {
264264
TyKind::OpaqueDef(item_id, _) => {
265265
let item = tcx.hir().item(item_id);
266-
let opaque = if let ItemKind::OpaqueTy(opaque) = &item.kind {
267-
opaque
268-
} else {
266+
let ItemKind::OpaqueTy(opaque) = &item.kind else {
269267
return;
270268
};
271269

compiler/rustc_infer/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#![feature(box_patterns)]
1818
#![feature(extend_one)]
1919
#![feature(iter_zip)]
20+
#![feature(let_else)]
2021
#![feature(never_type)]
2122
#![feature(in_band_lifetimes)]
2223
#![feature(control_flow_enum)]

compiler/rustc_metadata/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#![feature(crate_visibility_modifier)]
33
#![feature(drain_filter)]
44
#![feature(in_band_lifetimes)]
5+
#![feature(let_else)]
56
#![feature(nll)]
67
#![feature(once_cell)]
78
#![feature(proc_macro_internals)]

compiler/rustc_metadata/src/rmeta/decoder.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -472,9 +472,7 @@ impl<'a, 'tcx> Decodable<DecodeContext<'a, 'tcx>> for Span {
472472
let len = BytePos::decode(decoder)?;
473473
let hi = lo + len;
474474

475-
let sess = if let Some(sess) = decoder.sess {
476-
sess
477-
} else {
475+
let Some(sess) = decoder.sess else {
478476
bug!("Cannot decode Span without Session.")
479477
};
480478

compiler/rustc_middle/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#![feature(new_uninit)]
4040
#![feature(nll)]
4141
#![feature(once_cell)]
42+
#![feature(let_else)]
4243
#![feature(min_specialization)]
4344
#![feature(trusted_len)]
4445
#![feature(in_band_lifetimes)]

compiler/rustc_middle/src/ty/diagnostics.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,7 @@ pub fn suggest_constraining_type_param(
221221
) -> bool {
222222
let param = generics.params.iter().find(|p| p.name.ident().as_str() == param_name);
223223

224-
let param = if let Some(param) = param {
225-
param
226-
} else {
224+
let Some(param) = param else {
227225
return false;
228226
};
229227

compiler/rustc_middle/src/ty/layout.rs

+4-9
Original file line numberDiff line numberDiff line change
@@ -755,17 +755,14 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
755755
}
756756

757757
// Extract the number of elements from the layout of the array field:
758-
let len = if let Ok(TyAndLayout {
758+
let Ok(TyAndLayout {
759759
layout: Layout { fields: FieldsShape::Array { count, .. }, .. },
760760
..
761-
}) = self.layout_of(f0_ty)
762-
{
763-
count
764-
} else {
761+
}) = self.layout_of(f0_ty) else {
765762
return Err(LayoutError::Unknown(ty));
766763
};
767764

768-
(*e_ty, *len, true)
765+
(*e_ty, *count, true)
769766
} else {
770767
// First ADT field is not an array:
771768
(f0_ty, def.non_enum_variant().fields.len() as _, false)
@@ -787,9 +784,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
787784

788785
// Compute the ABI of the element type:
789786
let e_ly = self.layout_of(e_ty)?;
790-
let e_abi = if let Abi::Scalar(scalar) = e_ly.abi {
791-
scalar
792-
} else {
787+
let Abi::Scalar(e_abi) = e_ly.abi else {
793788
// This error isn't caught in typeck, e.g., if
794789
// the element type of the vector is generic.
795790
tcx.sess.fatal(&format!(

compiler/rustc_mir_build/src/build/expr/as_place.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -221,15 +221,13 @@ fn to_upvars_resolved_place_builder<'a, 'tcx>(
221221
let closure_hir_id = tcx.hir().local_def_id_to_hir_id(closure_def_id.expect_local());
222222
let closure_span = tcx.hir().span(closure_hir_id);
223223

224-
let (capture_index, capture) = if let Some(capture_details) =
224+
let Some((capture_index, capture)) =
225225
find_capture_matching_projections(
226226
typeck_results,
227227
var_hir_id,
228228
closure_def_id,
229229
&from_builder.projection,
230-
) {
231-
capture_details
232-
} else {
230+
) else {
233231
if !enable_precise_capture(tcx, closure_span) {
234232
bug!(
235233
"No associated capture found for {:?}[{:#?}] even though \

compiler/rustc_mir_build/src/build/scope.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -362,11 +362,7 @@ impl DropTree {
362362
blocks: &IndexVec<DropIdx, Option<BasicBlock>>,
363363
) {
364364
for (drop_idx, drop_data) in self.drops.iter_enumerated().rev() {
365-
let block = if let Some(block) = blocks[drop_idx] {
366-
block
367-
} else {
368-
continue;
369-
};
365+
let Some(block) = blocks[drop_idx] else { continue };
370366
match drop_data.0.kind {
371367
DropKind::Value => {
372368
let terminator = TerminatorKind::Drop {

compiler/rustc_mir_build/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#![feature(crate_visibility_modifier)]
77
#![feature(bool_to_option)]
88
#![feature(iter_zip)]
9+
#![feature(let_else)]
910
#![feature(once_cell)]
1011
#![feature(min_specialization)]
1112
#![recursion_limit = "256"]

compiler/rustc_mir_dataflow/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#![feature(exact_size_is_empty)]
77
#![feature(in_band_lifetimes)]
88
#![feature(iter_zip)]
9+
#![feature(let_else)]
910
#![feature(min_specialization)]
1011
#![feature(once_cell)]
1112
#![feature(stmt_expr_attributes)]

compiler/rustc_mir_dataflow/src/rustc_peek.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,7 @@ impl<'tcx> RustcPeekAt<'tcx> for MaybeMutBorrowedLocals<'_, 'tcx> {
290290
call: PeekCall,
291291
) {
292292
info!(?place, "peek_at");
293-
let local = if let Some(l) = place.as_local() {
294-
l
295-
} else {
293+
let Some(local) = place.as_local() else {
296294
tcx.sess.span_err(call.span, "rustc_peek: argument was not a local");
297295
return;
298296
};
@@ -312,9 +310,7 @@ impl<'tcx> RustcPeekAt<'tcx> for MaybeLiveLocals {
312310
call: PeekCall,
313311
) {
314312
info!(?place, "peek_at");
315-
let local = if let Some(l) = place.as_local() {
316-
l
317-
} else {
313+
let Some(local) = place.as_local() else {
318314
tcx.sess.span_err(call.span, "rustc_peek: argument was not a local");
319315
return;
320316
};

compiler/rustc_mir_transform/src/inline.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -673,9 +673,7 @@ impl Inliner<'tcx> {
673673
assert!(args.next().is_none());
674674

675675
let tuple = Place::from(tuple);
676-
let tuple_tys = if let ty::Tuple(s) = tuple.ty(caller_body, tcx).ty.kind() {
677-
s
678-
} else {
676+
let ty::Tuple(tuple_tys) = tuple.ty(caller_body, tcx).ty.kind() else {
679677
bug!("Closure arguments are not passed as a tuple");
680678
};
681679

compiler/rustc_mir_transform/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#![cfg_attr(bootstrap, feature(const_panic))]
55
#![feature(in_band_lifetimes)]
66
#![feature(iter_zip)]
7+
#![feature(let_else)]
78
#![feature(map_try_insert)]
89
#![feature(min_specialization)]
910
#![feature(option_get_or_insert_default)]

compiler/rustc_mir_transform/src/lower_slice_len.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ impl<'tcx> MirPass<'tcx> for LowerSliceLenCalls {
1717

1818
pub fn lower_slice_len_calls<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
1919
let language_items = tcx.lang_items();
20-
let slice_len_fn_item_def_id = if let Some(slice_len_fn_item) = language_items.slice_len_fn() {
21-
slice_len_fn_item
22-
} else {
20+
let Some(slice_len_fn_item_def_id) = language_items.slice_len_fn() else {
2321
// there is no language item to compare to :)
2422
return;
2523
};

0 commit comments

Comments
 (0)