Rollup merge of #128762 - fmease:use-more-slice-pats, r=compiler-errors
Use more slice patterns inside the compiler Nothing super noteworthy. Just replacing the common 'fragile' pattern of "length check followed by indexing or unwrap" with slice patterns for legibility and 'robustness'. r? ghost
This commit is contained in:
commit
32e0fe129d
40 changed files with 191 additions and 221 deletions
|
@ -350,8 +350,8 @@ fn bcb_filtered_successors<'a, 'tcx>(terminator: &'a Terminator<'tcx>) -> Covera
|
|||
// An inline asm terminator can normally be chained, except when it diverges or uses asm
|
||||
// goto.
|
||||
InlineAsm { ref targets, .. } => {
|
||||
if targets.len() == 1 {
|
||||
CoverageSuccessors::Chainable(targets[0])
|
||||
if let [target] = targets[..] {
|
||||
CoverageSuccessors::Chainable(target)
|
||||
} else {
|
||||
CoverageSuccessors::NotChainable(targets)
|
||||
}
|
||||
|
|
|
@ -309,11 +309,11 @@ fn verify_candidate_branch<'tcx>(
|
|||
) -> bool {
|
||||
// In order for the optimization to be correct, the branch must...
|
||||
// ...have exactly one statement
|
||||
if branch.statements.len() != 1 {
|
||||
let [statement] = branch.statements.as_slice() else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
// ...assign the discriminant of `place` in that statement
|
||||
let StatementKind::Assign(boxed) = &branch.statements[0].kind else { return false };
|
||||
let StatementKind::Assign(boxed) = &statement.kind else { return false };
|
||||
let (discr_place, Rvalue::Discriminant(from_place)) = &**boxed else { return false };
|
||||
if *from_place != place {
|
||||
return false;
|
||||
|
|
|
@ -264,9 +264,7 @@ impl<'tcx> InstSimplifyContext<'tcx, '_> {
|
|||
};
|
||||
|
||||
// It's definitely not a clone if there are multiple arguments
|
||||
if args.len() != 1 {
|
||||
return;
|
||||
}
|
||||
let [arg] = &args[..] else { return };
|
||||
|
||||
let Some(destination_block) = *target else { return };
|
||||
|
||||
|
@ -280,7 +278,7 @@ impl<'tcx> InstSimplifyContext<'tcx, '_> {
|
|||
|
||||
// These types are easily available from locals, so check that before
|
||||
// doing DefId lookups to figure out what we're actually calling.
|
||||
let arg_ty = args[0].node.ty(self.local_decls, self.tcx);
|
||||
let arg_ty = arg.node.ty(self.local_decls, self.tcx);
|
||||
|
||||
let ty::Ref(_region, inner_ty, Mutability::Not) = *arg_ty.kind() else { return };
|
||||
|
||||
|
|
|
@ -898,8 +898,8 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||
self.param_env,
|
||||
adt_def.non_enum_variant().fields[field].ty(self.tcx, args),
|
||||
);
|
||||
if fields.len() == 1 {
|
||||
let src_ty = fields.raw[0].ty(self.body, self.tcx);
|
||||
if let [field] = fields.raw.as_slice() {
|
||||
let src_ty = field.ty(self.body, self.tcx);
|
||||
if !self.mir_assign_valid_types(src_ty, dest_ty) {
|
||||
self.fail(location, "union field has the wrong type");
|
||||
}
|
||||
|
@ -967,11 +967,9 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||
self.fail(location, "RawPtr should be in runtime MIR only");
|
||||
}
|
||||
|
||||
if fields.len() != 2 {
|
||||
self.fail(location, "raw pointer aggregate must have 2 fields");
|
||||
} else {
|
||||
let data_ptr_ty = fields.raw[0].ty(self.body, self.tcx);
|
||||
let metadata_ty = fields.raw[1].ty(self.body, self.tcx);
|
||||
if let [data_ptr, metadata] = fields.raw.as_slice() {
|
||||
let data_ptr_ty = data_ptr.ty(self.body, self.tcx);
|
||||
let metadata_ty = metadata.ty(self.body, self.tcx);
|
||||
if let ty::RawPtr(in_pointee, in_mut) = data_ptr_ty.kind() {
|
||||
if *in_mut != mutability {
|
||||
self.fail(location, "input and output mutability must match");
|
||||
|
@ -998,6 +996,8 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||
self.fail(location, "metadata for pointer-to-thin must be unit");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.fail(location, "raw pointer aggregate must have 2 fields");
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue