Rollup merge of #81909 - wcampbell0x2a:remove-unnecessary-refs, r=estebank
[compiler/rustc_typeck/src/check/expr.rs] Remove unnecessary refs in pattern matching
This commit is contained in:
commit
fff36f199a
@ -168,7 +168,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
// without the final expr (e.g. `try { return; }`). We don't want to generate an
|
||||
// unreachable_code lint for it since warnings for autogenerated code are confusing.
|
||||
let is_try_block_generated_unit_expr = match expr.kind {
|
||||
ExprKind::Call(_, ref args) if expr.span.is_desugaring(DesugaringKind::TryBlock) => {
|
||||
ExprKind::Call(_, args) if expr.span.is_desugaring(DesugaringKind::TryBlock) => {
|
||||
args.len() == 1 && args[0].span.is_desugaring(DesugaringKind::TryBlock)
|
||||
}
|
||||
|
||||
@ -193,9 +193,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
// diverging expression (e.g. it arose from desugaring of `try { return }`),
|
||||
// we skip issuing a warning because it is autogenerated code.
|
||||
ExprKind::Call(..) if expr.span.is_desugaring(DesugaringKind::TryBlock) => {}
|
||||
ExprKind::Call(ref callee, _) => {
|
||||
self.warn_if_unreachable(expr.hir_id, callee.span, "call")
|
||||
}
|
||||
ExprKind::Call(callee, _) => self.warn_if_unreachable(expr.hir_id, callee.span, "call"),
|
||||
ExprKind::MethodCall(_, ref span, _, _) => {
|
||||
self.warn_if_unreachable(expr.hir_id, *span, "call")
|
||||
}
|
||||
@ -231,15 +229,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
|
||||
let tcx = self.tcx;
|
||||
match expr.kind {
|
||||
ExprKind::Box(ref subexpr) => self.check_expr_box(subexpr, expected),
|
||||
ExprKind::Box(subexpr) => self.check_expr_box(subexpr, expected),
|
||||
ExprKind::Lit(ref lit) => self.check_lit(&lit, expected),
|
||||
ExprKind::Binary(op, ref lhs, ref rhs) => self.check_binop(expr, op, lhs, rhs),
|
||||
ExprKind::Assign(ref lhs, ref rhs, ref span) => {
|
||||
ExprKind::Binary(op, lhs, rhs) => self.check_binop(expr, op, lhs, rhs),
|
||||
ExprKind::Assign(lhs, rhs, ref span) => {
|
||||
self.check_expr_assign(expr, expected, lhs, rhs, span)
|
||||
}
|
||||
ExprKind::AssignOp(op, ref lhs, ref rhs) => self.check_binop_assign(expr, op, lhs, rhs),
|
||||
ExprKind::Unary(unop, ref oprnd) => self.check_expr_unary(unop, oprnd, expected, expr),
|
||||
ExprKind::AddrOf(kind, mutbl, ref oprnd) => {
|
||||
ExprKind::AssignOp(op, lhs, rhs) => self.check_binop_assign(expr, op, lhs, rhs),
|
||||
ExprKind::Unary(unop, oprnd) => self.check_expr_unary(unop, oprnd, expected, expr),
|
||||
ExprKind::AddrOf(kind, mutbl, oprnd) => {
|
||||
self.check_expr_addr_of(kind, mutbl, oprnd, expected, expr)
|
||||
}
|
||||
ExprKind::Path(QPath::LangItem(lang_item, _)) => {
|
||||
@ -247,7 +245,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
ExprKind::Path(ref qpath) => self.check_expr_path(qpath, expr),
|
||||
ExprKind::InlineAsm(asm) => self.check_expr_asm(asm),
|
||||
ExprKind::LlvmInlineAsm(ref asm) => {
|
||||
ExprKind::LlvmInlineAsm(asm) => {
|
||||
for expr in asm.outputs_exprs.iter().chain(asm.inputs_exprs.iter()) {
|
||||
self.check_expr(expr);
|
||||
}
|
||||
@ -265,22 +263,22 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
ExprKind::Ret(ref expr_opt) => self.check_expr_return(expr_opt.as_deref(), expr),
|
||||
ExprKind::Loop(ref body, _, source, _) => {
|
||||
ExprKind::Loop(body, _, source, _) => {
|
||||
self.check_expr_loop(body, source, expected, expr)
|
||||
}
|
||||
ExprKind::Match(ref discrim, ref arms, match_src) => {
|
||||
ExprKind::Match(discrim, arms, match_src) => {
|
||||
self.check_match(expr, &discrim, arms, expected, match_src)
|
||||
}
|
||||
ExprKind::Closure(capture, ref decl, body_id, _, gen) => {
|
||||
ExprKind::Closure(capture, decl, body_id, _, gen) => {
|
||||
self.check_expr_closure(expr, capture, &decl, body_id, gen, expected)
|
||||
}
|
||||
ExprKind::Block(ref body, _) => self.check_block_with_expected(&body, expected),
|
||||
ExprKind::Call(ref callee, ref args) => self.check_call(expr, &callee, args, expected),
|
||||
ExprKind::MethodCall(ref segment, span, ref args, _) => {
|
||||
ExprKind::Block(body, _) => self.check_block_with_expected(&body, expected),
|
||||
ExprKind::Call(callee, args) => self.check_call(expr, &callee, args, expected),
|
||||
ExprKind::MethodCall(segment, span, args, _) => {
|
||||
self.check_method_call(expr, segment, span, args, expected)
|
||||
}
|
||||
ExprKind::Cast(ref e, ref t) => self.check_expr_cast(e, t, expr),
|
||||
ExprKind::Type(ref e, ref t) => {
|
||||
ExprKind::Cast(e, t) => self.check_expr_cast(e, t, expr),
|
||||
ExprKind::Type(e, t) => {
|
||||
let ty = self.to_ty_saving_user_provided_ty(&t);
|
||||
self.check_expr_eq_type(&e, ty);
|
||||
ty
|
||||
@ -288,19 +286,19 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
ExprKind::If(cond, then_expr, opt_else_expr) => {
|
||||
self.check_then_else(cond, then_expr, opt_else_expr, expr.span, expected)
|
||||
}
|
||||
ExprKind::DropTemps(ref e) => self.check_expr_with_expectation(e, expected),
|
||||
ExprKind::Array(ref args) => self.check_expr_array(args, expected, expr),
|
||||
ExprKind::DropTemps(e) => self.check_expr_with_expectation(e, expected),
|
||||
ExprKind::Array(args) => self.check_expr_array(args, expected, expr),
|
||||
ExprKind::ConstBlock(ref anon_const) => self.to_const(anon_const).ty,
|
||||
ExprKind::Repeat(ref element, ref count) => {
|
||||
ExprKind::Repeat(element, ref count) => {
|
||||
self.check_expr_repeat(element, count, expected, expr)
|
||||
}
|
||||
ExprKind::Tup(ref elts) => self.check_expr_tuple(elts, expected, expr),
|
||||
ExprKind::Struct(ref qpath, fields, ref base_expr) => {
|
||||
ExprKind::Tup(elts) => self.check_expr_tuple(elts, expected, expr),
|
||||
ExprKind::Struct(qpath, fields, ref base_expr) => {
|
||||
self.check_expr_struct(expr, expected, qpath, fields, base_expr)
|
||||
}
|
||||
ExprKind::Field(ref base, field) => self.check_field(expr, &base, field),
|
||||
ExprKind::Index(ref base, ref idx) => self.check_expr_index(base, idx, expr),
|
||||
ExprKind::Yield(ref value, ref src) => self.check_expr_yield(value, expr, src),
|
||||
ExprKind::Field(base, field) => self.check_field(expr, &base, field),
|
||||
ExprKind::Index(base, idx) => self.check_expr_index(base, idx, expr),
|
||||
ExprKind::Yield(value, ref src) => self.check_expr_yield(value, expr, src),
|
||||
hir::ExprKind::Err => tcx.ty_error(),
|
||||
}
|
||||
}
|
||||
@ -541,7 +539,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let tcx = self.tcx;
|
||||
if let Ok(target_id) = destination.target_id {
|
||||
let (e_ty, cause);
|
||||
if let Some(ref e) = expr_opt {
|
||||
if let Some(e) = expr_opt {
|
||||
// If this is a break with a value, we need to type-check
|
||||
// the expression. Get an expected type from the loop context.
|
||||
let opt_coerce_to = {
|
||||
@ -650,12 +648,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
|
||||
// We still need to assign a type to the inner expression to
|
||||
// prevent the ICE in #43162.
|
||||
if let Some(ref e) = expr_opt {
|
||||
if let Some(e) = expr_opt {
|
||||
self.check_expr_with_hint(e, err);
|
||||
|
||||
// ... except when we try to 'break rust;'.
|
||||
// ICE this expression in particular (see #43162).
|
||||
if let ExprKind::Path(QPath::Resolved(_, ref path)) = e.kind {
|
||||
if let ExprKind::Path(QPath::Resolved(_, path)) = e.kind {
|
||||
if path.segments.len() == 1 && path.segments[0].ident.name == sym::rust {
|
||||
fatally_break_rust(self.tcx.sess);
|
||||
}
|
||||
@ -674,7 +672,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
) -> Ty<'tcx> {
|
||||
if self.ret_coercion.is_none() {
|
||||
self.tcx.sess.emit_err(ReturnStmtOutsideOfFnBody { span: expr.span });
|
||||
} else if let Some(ref e) = expr_opt {
|
||||
} else if let Some(e) = expr_opt {
|
||||
if self.ret_coercion_span.get().is_none() {
|
||||
self.ret_coercion_span.set(Some(e.span));
|
||||
}
|
||||
@ -1133,13 +1131,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let flds = expected.only_has_type(self).and_then(|ty| {
|
||||
let ty = self.resolve_vars_with_obligations(ty);
|
||||
match ty.kind() {
|
||||
ty::Tuple(ref flds) => Some(&flds[..]),
|
||||
ty::Tuple(flds) => Some(&flds[..]),
|
||||
_ => None,
|
||||
}
|
||||
});
|
||||
|
||||
let elt_ts_iter = elts.iter().enumerate().map(|(i, e)| match flds {
|
||||
Some(ref fs) if i < fs.len() => {
|
||||
Some(fs) if i < fs.len() => {
|
||||
let ety = fs[i].expect_ty();
|
||||
self.check_expr_coercable_to_type(&e, ety, None);
|
||||
ety
|
||||
@ -1328,7 +1326,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
for field in fields {
|
||||
self.check_expr(&field.expr);
|
||||
}
|
||||
if let Some(ref base) = *base_expr {
|
||||
if let Some(base) = *base_expr {
|
||||
self.check_expr(&base);
|
||||
}
|
||||
}
|
||||
@ -1488,7 +1486,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
},
|
||||
_ => {
|
||||
// prevent all specified fields from being suggested
|
||||
let skip_fields = skip_fields.iter().map(|ref x| x.ident.name);
|
||||
let skip_fields = skip_fields.iter().map(|x| x.ident.name);
|
||||
if let Some(field_name) =
|
||||
Self::suggest_field_name(variant, field.ident.name, skip_fields.collect())
|
||||
{
|
||||
@ -1617,7 +1615,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
private_candidate = Some((base_def.did, field_ty));
|
||||
}
|
||||
}
|
||||
ty::Tuple(ref tys) => {
|
||||
ty::Tuple(tys) => {
|
||||
let fstr = field.as_str();
|
||||
if let Ok(index) = fstr.parse::<usize>() {
|
||||
if fstr == index.to_string() {
|
||||
|
Loading…
Reference in New Issue
Block a user