Fix clippy::needless_borrow
in the compiler
`x clippy compiler -Aclippy::all -Wclippy::needless_borrow --fix`. Then I had to remove a few unnecessary parens and muts that were exposed now.
This commit is contained in:
parent
0ff8610964
commit
21a870515b
304 changed files with 1101 additions and 1174 deletions
|
@ -130,59 +130,59 @@ impl CheckAttrVisitor<'_> {
|
|||
&mut specified_inline,
|
||||
&mut doc_aliases,
|
||||
),
|
||||
sym::no_link => self.check_no_link(hir_id, &attr, span, target),
|
||||
sym::export_name => self.check_export_name(hir_id, &attr, span, target),
|
||||
sym::no_link => self.check_no_link(hir_id, attr, span, target),
|
||||
sym::export_name => self.check_export_name(hir_id, attr, span, target),
|
||||
sym::rustc_layout_scalar_valid_range_start
|
||||
| sym::rustc_layout_scalar_valid_range_end => {
|
||||
self.check_rustc_layout_scalar_valid_range(&attr, span, target)
|
||||
self.check_rustc_layout_scalar_valid_range(attr, span, target)
|
||||
}
|
||||
sym::allow_internal_unstable => {
|
||||
self.check_allow_internal_unstable(hir_id, &attr, span, target, &attrs)
|
||||
self.check_allow_internal_unstable(hir_id, attr, span, target, attrs)
|
||||
}
|
||||
sym::debugger_visualizer => self.check_debugger_visualizer(&attr, target),
|
||||
sym::debugger_visualizer => self.check_debugger_visualizer(attr, target),
|
||||
sym::rustc_allow_const_fn_unstable => {
|
||||
self.check_rustc_allow_const_fn_unstable(hir_id, &attr, span, target)
|
||||
self.check_rustc_allow_const_fn_unstable(hir_id, attr, span, target)
|
||||
}
|
||||
sym::rustc_std_internal_symbol => {
|
||||
self.check_rustc_std_internal_symbol(&attr, span, target)
|
||||
self.check_rustc_std_internal_symbol(attr, span, target)
|
||||
}
|
||||
sym::naked => self.check_naked(hir_id, attr, span, target),
|
||||
sym::rustc_never_returns_null_ptr => {
|
||||
self.check_applied_to_fn_or_method(hir_id, attr, span, target)
|
||||
}
|
||||
sym::rustc_legacy_const_generics => {
|
||||
self.check_rustc_legacy_const_generics(hir_id, &attr, span, target, item)
|
||||
self.check_rustc_legacy_const_generics(hir_id, attr, span, target, item)
|
||||
}
|
||||
sym::rustc_lint_query_instability => {
|
||||
self.check_rustc_lint_query_instability(hir_id, &attr, span, target)
|
||||
self.check_rustc_lint_query_instability(hir_id, attr, span, target)
|
||||
}
|
||||
sym::rustc_lint_diagnostics => {
|
||||
self.check_rustc_lint_diagnostics(hir_id, &attr, span, target)
|
||||
self.check_rustc_lint_diagnostics(hir_id, attr, span, target)
|
||||
}
|
||||
sym::rustc_lint_opt_ty => self.check_rustc_lint_opt_ty(&attr, span, target),
|
||||
sym::rustc_lint_opt_ty => self.check_rustc_lint_opt_ty(attr, span, target),
|
||||
sym::rustc_lint_opt_deny_field_access => {
|
||||
self.check_rustc_lint_opt_deny_field_access(&attr, span, target)
|
||||
self.check_rustc_lint_opt_deny_field_access(attr, span, target)
|
||||
}
|
||||
sym::rustc_clean
|
||||
| sym::rustc_dirty
|
||||
| sym::rustc_if_this_changed
|
||||
| sym::rustc_then_this_would_need => self.check_rustc_dirty_clean(&attr),
|
||||
| sym::rustc_then_this_would_need => self.check_rustc_dirty_clean(attr),
|
||||
sym::rustc_coinductive
|
||||
| sym::rustc_must_implement_one_of
|
||||
| sym::rustc_deny_explicit_impl
|
||||
| sym::const_trait => self.check_must_be_applied_to_trait(&attr, span, target),
|
||||
| sym::const_trait => self.check_must_be_applied_to_trait(attr, span, target),
|
||||
sym::cmse_nonsecure_entry => {
|
||||
self.check_cmse_nonsecure_entry(hir_id, attr, span, target)
|
||||
}
|
||||
sym::collapse_debuginfo => self.check_collapse_debuginfo(attr, span, target),
|
||||
sym::must_not_suspend => self.check_must_not_suspend(&attr, span, target),
|
||||
sym::must_use => self.check_must_use(hir_id, &attr, target),
|
||||
sym::rustc_pass_by_value => self.check_pass_by_value(&attr, span, target),
|
||||
sym::must_not_suspend => self.check_must_not_suspend(attr, span, target),
|
||||
sym::must_use => self.check_must_use(hir_id, attr, target),
|
||||
sym::rustc_pass_by_value => self.check_pass_by_value(attr, span, target),
|
||||
sym::rustc_allow_incoherent_impl => {
|
||||
self.check_allow_incoherent_impl(&attr, span, target)
|
||||
self.check_allow_incoherent_impl(attr, span, target)
|
||||
}
|
||||
sym::rustc_has_incoherent_inherent_impls => {
|
||||
self.check_has_incoherent_inherent_impls(&attr, span, target)
|
||||
self.check_has_incoherent_inherent_impls(attr, span, target)
|
||||
}
|
||||
sym::ffi_pure => self.check_ffi_pure(attr.span, attrs, target),
|
||||
sym::ffi_const => self.check_ffi_const(attr.span, target),
|
||||
|
@ -192,9 +192,9 @@ impl CheckAttrVisitor<'_> {
|
|||
| sym::unstable
|
||||
| sym::stable
|
||||
| sym::rustc_allowed_through_unstable_modules
|
||||
| sym::rustc_promotable => self.check_stability_promotable(&attr, span, target),
|
||||
sym::link_ordinal => self.check_link_ordinal(&attr, span, target),
|
||||
sym::rustc_confusables => self.check_confusables(&attr, target),
|
||||
| sym::rustc_promotable => self.check_stability_promotable(attr, span, target),
|
||||
sym::link_ordinal => self.check_link_ordinal(attr, span, target),
|
||||
sym::rustc_confusables => self.check_confusables(attr, target),
|
||||
sym::rustc_safe_intrinsic => {
|
||||
self.check_rustc_safe_intrinsic(hir_id, attr, span, target)
|
||||
}
|
||||
|
@ -824,7 +824,7 @@ impl CheckAttrVisitor<'_> {
|
|||
hir::Node::Item(item) => Some(&item.kind),
|
||||
_ => None,
|
||||
}) {
|
||||
Some(ItemKind::Mod(ref module)) => {
|
||||
Some(ItemKind::Mod(module)) => {
|
||||
if !module.item_ids.is_empty() {
|
||||
self.tcx.sess.emit_err(errors::DocKeywordEmptyMod { span: meta.span() });
|
||||
return false;
|
||||
|
@ -850,7 +850,7 @@ impl CheckAttrVisitor<'_> {
|
|||
hir::Node::Item(item) => Some(&item.kind),
|
||||
_ => None,
|
||||
}) {
|
||||
Some(ItemKind::Impl(ref i)) => {
|
||||
Some(ItemKind::Impl(i)) => {
|
||||
let is_valid = matches!(&i.self_ty.kind, hir::TyKind::Tup([_]))
|
||||
|| if let hir::TyKind::BareFn(bare_fn_ty) = &i.self_ty.kind {
|
||||
bare_fn_ty.decl.inputs.len() == 1
|
||||
|
@ -2395,7 +2395,7 @@ impl<'tcx> Visitor<'tcx> for CheckAttrVisitor<'tcx> {
|
|||
// Historically we've run more checks on non-exported than exported macros,
|
||||
// so this lets us continue to run them while maintaining backwards compatibility.
|
||||
// In the long run, the checks should be harmonized.
|
||||
if let ItemKind::Macro(ref macro_def, _) = item.kind {
|
||||
if let ItemKind::Macro(macro_def, _) = item.kind {
|
||||
let def_id = item.owner_id.to_def_id();
|
||||
if macro_def.macro_rules && !self.tcx.has_attr(def_id, sym::macro_export) {
|
||||
check_non_exported_macro_for_invalid_attrs(self.tcx, item);
|
||||
|
@ -2443,7 +2443,7 @@ impl<'tcx> Visitor<'tcx> for CheckAttrVisitor<'tcx> {
|
|||
|
||||
fn visit_stmt(&mut self, stmt: &'tcx hir::Stmt<'tcx>) {
|
||||
// When checking statements ignore expressions, they will be checked later.
|
||||
if let hir::StmtKind::Local(ref l) = stmt.kind {
|
||||
if let hir::StmtKind::Local(l) = stmt.kind {
|
||||
self.check_attributes(l.hir_id, stmt.span, Target::Statement, None);
|
||||
}
|
||||
intravisit::walk_stmt(self, stmt)
|
||||
|
|
|
@ -111,7 +111,7 @@ impl<'tcx> CheckConstVisitor<'tcx> {
|
|||
// However, we cannot allow stable `const fn`s to use unstable features without an explicit
|
||||
// opt-in via `rustc_allow_const_fn_unstable`.
|
||||
let attrs = tcx.hir().attrs(tcx.hir().local_def_id_to_hir_id(def_id));
|
||||
attr::rustc_allow_const_fn_unstable(&tcx.sess, attrs).any(|name| name == feature_gate)
|
||||
attr::rustc_allow_const_fn_unstable(tcx.sess, attrs).any(|name| name == feature_gate)
|
||||
};
|
||||
|
||||
match required_gates {
|
||||
|
|
|
@ -373,10 +373,10 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
|
|||
self.repr_has_repr_c = def.repr().c();
|
||||
self.repr_has_repr_simd = def.repr().simd();
|
||||
|
||||
intravisit::walk_item(self, &item)
|
||||
intravisit::walk_item(self, item)
|
||||
}
|
||||
hir::ItemKind::ForeignMod { .. } => {}
|
||||
_ => intravisit::walk_item(self, &item),
|
||||
_ => intravisit::walk_item(self, item),
|
||||
},
|
||||
Node::TraitItem(trait_item) => {
|
||||
intravisit::walk_trait_item(self, trait_item);
|
||||
|
@ -403,7 +403,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
|
|||
intravisit::walk_impl_item(self, impl_item);
|
||||
}
|
||||
Node::ForeignItem(foreign_item) => {
|
||||
intravisit::walk_foreign_item(self, &foreign_item);
|
||||
intravisit::walk_foreign_item(self, foreign_item);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
@ -459,9 +459,9 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
|
|||
self.lookup_and_handle_method(expr.hir_id);
|
||||
}
|
||||
hir::ExprKind::Field(ref lhs, ..) => {
|
||||
self.handle_field_access(&lhs, expr.hir_id);
|
||||
self.handle_field_access(lhs, expr.hir_id);
|
||||
}
|
||||
hir::ExprKind::Struct(ref qpath, ref fields, _) => {
|
||||
hir::ExprKind::Struct(qpath, fields, _) => {
|
||||
let res = self.typeck_results().qpath_res(qpath, expr.hir_id);
|
||||
self.handle_res(res);
|
||||
if let ty::Adt(adt, _) = self.typeck_results().expr_ty(expr).kind() {
|
||||
|
@ -493,7 +493,7 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
|
|||
fn visit_pat(&mut self, pat: &'tcx hir::Pat<'tcx>) {
|
||||
self.in_pat = true;
|
||||
match pat.kind {
|
||||
PatKind::Struct(ref path, ref fields, _) => {
|
||||
PatKind::Struct(ref path, fields, _) => {
|
||||
let res = self.typeck_results().qpath_res(path, pat.hir_id);
|
||||
self.handle_field_pattern_match(pat, res, fields);
|
||||
}
|
||||
|
@ -501,7 +501,7 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
|
|||
let res = self.typeck_results().qpath_res(qpath, pat.hir_id);
|
||||
self.handle_res(res);
|
||||
}
|
||||
PatKind::TupleStruct(ref qpath, ref fields, dotdot) => {
|
||||
PatKind::TupleStruct(ref qpath, fields, dotdot) => {
|
||||
let res = self.typeck_results().qpath_res(qpath, pat.hir_id);
|
||||
self.handle_tuple_field_pattern_match(pat, res, fields, dotdot);
|
||||
}
|
||||
|
@ -1011,7 +1011,7 @@ fn check_mod_deathness(tcx: TyCtxt<'_>, module: LocalModDefId) {
|
|||
let def_id = field.did.expect_local();
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
if let ShouldWarnAboutField::Yes(is_pos) =
|
||||
visitor.should_warn_about_field(&field)
|
||||
visitor.should_warn_about_field(field)
|
||||
{
|
||||
let level = tcx
|
||||
.lint_level_at_node(
|
||||
|
|
|
@ -38,7 +38,7 @@ fn entry_fn(tcx: TyCtxt<'_>, (): ()) -> Option<(DefId, EntryFnType)> {
|
|||
}
|
||||
|
||||
// If the user wants no main function at all, then stop here.
|
||||
if attr::contains_name(&tcx.hir().attrs(CRATE_HIR_ID), sym::no_main) {
|
||||
if attr::contains_name(tcx.hir().attrs(CRATE_HIR_ID), sym::no_main) {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ impl<'tcx> LanguageItemCollector<'tcx> {
|
|||
|
||||
fn check_for_lang(&mut self, actual_target: Target, def_id: LocalDefId) {
|
||||
let attrs = self.tcx.hir().attrs(self.tcx.hir().local_def_id_to_hir_id(def_id));
|
||||
if let Some((name, span)) = extract(&attrs) {
|
||||
if let Some((name, span)) = extract(attrs) {
|
||||
match LangItem::from_name(name) {
|
||||
// Known lang item with attribute on correct target.
|
||||
Some(lang_item) if actual_target == lang_item.target() => {
|
||||
|
|
|
@ -170,7 +170,7 @@ fn check_liveness(tcx: TyCtxt<'_>, def_id: LocalDefId) {
|
|||
|
||||
// compute liveness
|
||||
let mut lsets = Liveness::new(&mut maps, def_id);
|
||||
let entry_ln = lsets.compute(&body, hir_id);
|
||||
let entry_ln = lsets.compute(body, hir_id);
|
||||
lsets.log_liveness(entry_ln, body_id.hir_id);
|
||||
|
||||
// check for various error conditions
|
||||
|
@ -366,7 +366,7 @@ impl<'tcx> IrMaps<'tcx> {
|
|||
|
||||
impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> {
|
||||
fn visit_local(&mut self, local: &'tcx hir::Local<'tcx>) {
|
||||
self.add_from_pat(&local.pat);
|
||||
self.add_from_pat(local.pat);
|
||||
if local.els.is_some() {
|
||||
self.add_live_node_for_node(local.hir_id, ExprNode(local.span, local.hir_id));
|
||||
}
|
||||
|
@ -374,8 +374,8 @@ impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> {
|
|||
}
|
||||
|
||||
fn visit_arm(&mut self, arm: &'tcx hir::Arm<'tcx>) {
|
||||
self.add_from_pat(&arm.pat);
|
||||
if let Some(hir::Guard::IfLet(ref let_expr)) = arm.guard {
|
||||
self.add_from_pat(arm.pat);
|
||||
if let Some(hir::Guard::IfLet(let_expr)) = arm.guard {
|
||||
self.add_from_pat(let_expr.pat);
|
||||
}
|
||||
intravisit::walk_arm(self, arm);
|
||||
|
@ -400,7 +400,7 @@ impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> {
|
|||
fn visit_expr(&mut self, expr: &'tcx Expr<'tcx>) {
|
||||
match expr.kind {
|
||||
// live nodes required for uses or definitions of variables:
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) => {
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(_, path)) => {
|
||||
debug!("expr {}: path that leads to {:?}", expr.hir_id, path.res);
|
||||
if let Res::Local(_var_hir_id) = path.res {
|
||||
self.add_live_node_for_node(expr.hir_id, ExprNode(expr.span, expr.hir_id));
|
||||
|
@ -736,7 +736,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
let succ = self.propagate_through_expr(&body.value, self.exit_ln);
|
||||
let succ = self.propagate_through_expr(body.value, self.exit_ln);
|
||||
|
||||
if self.closure_min_captures.is_none() {
|
||||
// Either not a closure, or closure without any captured variables.
|
||||
|
@ -776,7 +776,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
if !self.merge_from_succ(self.exit_ln, self.closure_ln) {
|
||||
break;
|
||||
}
|
||||
assert_eq!(succ, self.propagate_through_expr(&body.value, self.exit_ln));
|
||||
assert_eq!(succ, self.propagate_through_expr(body.value, self.exit_ln));
|
||||
}
|
||||
|
||||
succ
|
||||
|
@ -792,7 +792,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
|
||||
fn propagate_through_stmt(&mut self, stmt: &hir::Stmt<'_>, succ: LiveNode) -> LiveNode {
|
||||
match stmt.kind {
|
||||
hir::StmtKind::Local(ref local) => {
|
||||
hir::StmtKind::Local(local) => {
|
||||
// Note: we mark the variable as defined regardless of whether
|
||||
// there is an initializer. Initially I had thought to only mark
|
||||
// the live variable as defined if it was initialized, and then we
|
||||
|
@ -830,7 +830,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
self.init_from_succ(ln, succ);
|
||||
self.merge_from_succ(ln, else_ln);
|
||||
let succ = self.propagate_through_expr(init, ln);
|
||||
self.define_bindings_in_pat(&local.pat, succ)
|
||||
self.define_bindings_in_pat(local.pat, succ)
|
||||
} else {
|
||||
span_bug!(
|
||||
stmt.span,
|
||||
|
@ -839,18 +839,18 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
}
|
||||
} else {
|
||||
let succ = self.propagate_through_opt_expr(local.init, succ);
|
||||
self.define_bindings_in_pat(&local.pat, succ)
|
||||
self.define_bindings_in_pat(local.pat, succ)
|
||||
}
|
||||
}
|
||||
hir::StmtKind::Item(..) => succ,
|
||||
hir::StmtKind::Expr(ref expr) | hir::StmtKind::Semi(ref expr) => {
|
||||
self.propagate_through_expr(&expr, succ)
|
||||
self.propagate_through_expr(expr, succ)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn propagate_through_exprs(&mut self, exprs: &[Expr<'_>], succ: LiveNode) -> LiveNode {
|
||||
exprs.iter().rev().fold(succ, |succ, expr| self.propagate_through_expr(&expr, succ))
|
||||
exprs.iter().rev().fold(succ, |succ, expr| self.propagate_through_expr(expr, succ))
|
||||
}
|
||||
|
||||
fn propagate_through_opt_expr(
|
||||
|
@ -866,11 +866,11 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
|
||||
match expr.kind {
|
||||
// Interesting cases with control flow or which gen/kill
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) => {
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(_, path)) => {
|
||||
self.access_path(expr.hir_id, path, succ, ACC_READ | ACC_USE)
|
||||
}
|
||||
|
||||
hir::ExprKind::Field(ref e, _) => self.propagate_through_expr(&e, succ),
|
||||
hir::ExprKind::Field(ref e, _) => self.propagate_through_expr(e, succ),
|
||||
|
||||
hir::ExprKind::Closure { .. } => {
|
||||
debug!("{:?} is an ExprKind::Closure", expr);
|
||||
|
@ -899,9 +899,9 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
|
||||
// Note that labels have been resolved, so we don't need to look
|
||||
// at the label ident
|
||||
hir::ExprKind::Loop(ref blk, ..) => self.propagate_through_loop(expr, &blk, succ),
|
||||
hir::ExprKind::Loop(ref blk, ..) => self.propagate_through_loop(expr, blk, succ),
|
||||
|
||||
hir::ExprKind::Yield(ref e, ..) => {
|
||||
hir::ExprKind::Yield(e, ..) => {
|
||||
let yield_ln = self.live_node(expr.hir_id, expr.span);
|
||||
self.init_from_succ(yield_ln, succ);
|
||||
self.merge_from_succ(yield_ln, self.exit_ln);
|
||||
|
@ -923,11 +923,11 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
// ( succ )
|
||||
//
|
||||
let else_ln = self.propagate_through_opt_expr(else_opt.as_deref(), succ);
|
||||
let then_ln = self.propagate_through_expr(&then, succ);
|
||||
let then_ln = self.propagate_through_expr(then, succ);
|
||||
let ln = self.live_node(expr.hir_id, expr.span);
|
||||
self.init_from_succ(ln, else_ln);
|
||||
self.merge_from_succ(ln, then_ln);
|
||||
self.propagate_through_expr(&cond, ln)
|
||||
self.propagate_through_expr(cond, ln)
|
||||
}
|
||||
|
||||
hir::ExprKind::Match(ref e, arms, _) => {
|
||||
|
@ -948,7 +948,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
let ln = self.live_node(expr.hir_id, expr.span);
|
||||
self.init_empty(ln, succ);
|
||||
for arm in arms {
|
||||
let body_succ = self.propagate_through_expr(&arm.body, succ);
|
||||
let body_succ = self.propagate_through_expr(arm.body, succ);
|
||||
|
||||
let guard_succ = arm.guard.as_ref().map_or(body_succ, |g| match g {
|
||||
hir::Guard::If(e) => self.propagate_through_expr(e, body_succ),
|
||||
|
@ -957,10 +957,10 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
self.propagate_through_expr(let_expr.init, let_bind)
|
||||
}
|
||||
});
|
||||
let arm_succ = self.define_bindings_in_pat(&arm.pat, guard_succ);
|
||||
let arm_succ = self.define_bindings_in_pat(arm.pat, guard_succ);
|
||||
self.merge_from_succ(ln, arm_succ);
|
||||
}
|
||||
self.propagate_through_expr(&e, ln)
|
||||
self.propagate_through_expr(e, ln)
|
||||
}
|
||||
|
||||
hir::ExprKind::Ret(ref o_e) => {
|
||||
|
@ -968,7 +968,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
self.propagate_through_opt_expr(o_e.as_deref(), self.exit_ln)
|
||||
}
|
||||
|
||||
hir::ExprKind::Become(ref e) => {
|
||||
hir::ExprKind::Become(e) => {
|
||||
// Ignore succ and subst exit_ln.
|
||||
self.propagate_through_expr(e, self.exit_ln)
|
||||
}
|
||||
|
@ -1007,63 +1007,63 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
hir::ExprKind::Assign(ref l, ref r, _) => {
|
||||
// see comment on places in
|
||||
// propagate_through_place_components()
|
||||
let succ = self.write_place(&l, succ, ACC_WRITE);
|
||||
let succ = self.propagate_through_place_components(&l, succ);
|
||||
self.propagate_through_expr(&r, succ)
|
||||
let succ = self.write_place(l, succ, ACC_WRITE);
|
||||
let succ = self.propagate_through_place_components(l, succ);
|
||||
self.propagate_through_expr(r, succ)
|
||||
}
|
||||
|
||||
hir::ExprKind::AssignOp(_, ref l, ref r) => {
|
||||
// an overloaded assign op is like a method call
|
||||
if self.typeck_results.is_method_call(expr) {
|
||||
let succ = self.propagate_through_expr(&l, succ);
|
||||
self.propagate_through_expr(&r, succ)
|
||||
let succ = self.propagate_through_expr(l, succ);
|
||||
self.propagate_through_expr(r, succ)
|
||||
} else {
|
||||
// see comment on places in
|
||||
// propagate_through_place_components()
|
||||
let succ = self.write_place(&l, succ, ACC_WRITE | ACC_READ);
|
||||
let succ = self.propagate_through_expr(&r, succ);
|
||||
self.propagate_through_place_components(&l, succ)
|
||||
let succ = self.write_place(l, succ, ACC_WRITE | ACC_READ);
|
||||
let succ = self.propagate_through_expr(r, succ);
|
||||
self.propagate_through_place_components(l, succ)
|
||||
}
|
||||
}
|
||||
|
||||
// Uninteresting cases: just propagate in rev exec order
|
||||
hir::ExprKind::Array(ref exprs) => self.propagate_through_exprs(exprs, succ),
|
||||
hir::ExprKind::Array(exprs) => self.propagate_through_exprs(exprs, succ),
|
||||
|
||||
hir::ExprKind::Struct(_, ref fields, ref with_expr) => {
|
||||
hir::ExprKind::Struct(_, fields, ref with_expr) => {
|
||||
let succ = self.propagate_through_opt_expr(with_expr.as_deref(), succ);
|
||||
fields
|
||||
.iter()
|
||||
.rev()
|
||||
.fold(succ, |succ, field| self.propagate_through_expr(&field.expr, succ))
|
||||
.fold(succ, |succ, field| self.propagate_through_expr(field.expr, succ))
|
||||
}
|
||||
|
||||
hir::ExprKind::Call(ref f, ref args) => {
|
||||
hir::ExprKind::Call(ref f, args) => {
|
||||
let succ = self.check_is_ty_uninhabited(expr, succ);
|
||||
let succ = self.propagate_through_exprs(args, succ);
|
||||
self.propagate_through_expr(&f, succ)
|
||||
self.propagate_through_expr(f, succ)
|
||||
}
|
||||
|
||||
hir::ExprKind::MethodCall(.., receiver, ref args, _) => {
|
||||
hir::ExprKind::MethodCall(.., receiver, args, _) => {
|
||||
let succ = self.check_is_ty_uninhabited(expr, succ);
|
||||
let succ = self.propagate_through_exprs(args, succ);
|
||||
self.propagate_through_expr(receiver, succ)
|
||||
}
|
||||
|
||||
hir::ExprKind::Tup(ref exprs) => self.propagate_through_exprs(exprs, succ),
|
||||
hir::ExprKind::Tup(exprs) => self.propagate_through_exprs(exprs, succ),
|
||||
|
||||
hir::ExprKind::Binary(op, ref l, ref r) if op.node.is_lazy() => {
|
||||
let r_succ = self.propagate_through_expr(&r, succ);
|
||||
let r_succ = self.propagate_through_expr(r, succ);
|
||||
|
||||
let ln = self.live_node(expr.hir_id, expr.span);
|
||||
self.init_from_succ(ln, succ);
|
||||
self.merge_from_succ(ln, r_succ);
|
||||
|
||||
self.propagate_through_expr(&l, ln)
|
||||
self.propagate_through_expr(l, ln)
|
||||
}
|
||||
|
||||
hir::ExprKind::Index(ref l, ref r, _) | hir::ExprKind::Binary(_, ref l, ref r) => {
|
||||
let r_succ = self.propagate_through_expr(&r, succ);
|
||||
self.propagate_through_expr(&l, r_succ)
|
||||
let r_succ = self.propagate_through_expr(r, succ);
|
||||
self.propagate_through_expr(l, r_succ)
|
||||
}
|
||||
|
||||
hir::ExprKind::AddrOf(_, _, ref e)
|
||||
|
@ -1071,9 +1071,9 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
| hir::ExprKind::Type(ref e, _)
|
||||
| hir::ExprKind::DropTemps(ref e)
|
||||
| hir::ExprKind::Unary(_, ref e)
|
||||
| hir::ExprKind::Repeat(ref e, _) => self.propagate_through_expr(&e, succ),
|
||||
| hir::ExprKind::Repeat(ref e, _) => self.propagate_through_expr(e, succ),
|
||||
|
||||
hir::ExprKind::InlineAsm(ref asm) => {
|
||||
hir::ExprKind::InlineAsm(asm) => {
|
||||
// Handle non-returning asm
|
||||
let mut succ = if asm.options.contains(InlineAsmOptions::NORETURN) {
|
||||
self.exit_ln
|
||||
|
@ -1141,7 +1141,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
|
||||
// Note that labels have been resolved, so we don't need to look
|
||||
// at the label ident
|
||||
hir::ExprKind::Block(ref blk, _) => self.propagate_through_block(&blk, succ),
|
||||
hir::ExprKind::Block(ref blk, _) => self.propagate_through_block(blk, succ),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1197,7 +1197,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
|
||||
match expr.kind {
|
||||
hir::ExprKind::Path(_) => succ,
|
||||
hir::ExprKind::Field(ref e, _) => self.propagate_through_expr(&e, succ),
|
||||
hir::ExprKind::Field(ref e, _) => self.propagate_through_expr(e, succ),
|
||||
_ => self.propagate_through_expr(expr, succ),
|
||||
}
|
||||
}
|
||||
|
@ -1205,7 +1205,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
// see comment on propagate_through_place()
|
||||
fn write_place(&mut self, expr: &Expr<'_>, succ: LiveNode, acc: u32) -> LiveNode {
|
||||
match expr.kind {
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) => {
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(_, path)) => {
|
||||
self.access_path(expr.hir_id, path, succ, acc)
|
||||
}
|
||||
|
||||
|
@ -1341,7 +1341,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
|
||||
impl<'a, 'tcx> Visitor<'tcx> for Liveness<'a, 'tcx> {
|
||||
fn visit_local(&mut self, local: &'tcx hir::Local<'tcx>) {
|
||||
self.check_unused_vars_in_pat(&local.pat, None, None, |spans, hir_id, ln, var| {
|
||||
self.check_unused_vars_in_pat(local.pat, None, None, |spans, hir_id, ln, var| {
|
||||
if local.init.is_some() {
|
||||
self.warn_about_dead_assign(spans, hir_id, ln, var);
|
||||
}
|
||||
|
@ -1356,7 +1356,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Liveness<'a, 'tcx> {
|
|||
}
|
||||
|
||||
fn visit_arm(&mut self, arm: &'tcx hir::Arm<'tcx>) {
|
||||
self.check_unused_vars_in_pat(&arm.pat, None, None, |_, _, _, _| {});
|
||||
self.check_unused_vars_in_pat(arm.pat, None, None, |_, _, _, _| {});
|
||||
intravisit::walk_arm(self, arm);
|
||||
}
|
||||
}
|
||||
|
@ -1364,16 +1364,16 @@ impl<'a, 'tcx> Visitor<'tcx> for Liveness<'a, 'tcx> {
|
|||
fn check_expr<'tcx>(this: &mut Liveness<'_, 'tcx>, expr: &'tcx Expr<'tcx>) {
|
||||
match expr.kind {
|
||||
hir::ExprKind::Assign(ref l, ..) => {
|
||||
this.check_place(&l);
|
||||
this.check_place(l);
|
||||
}
|
||||
|
||||
hir::ExprKind::AssignOp(_, ref l, _) => {
|
||||
if !this.typeck_results.is_method_call(expr) {
|
||||
this.check_place(&l);
|
||||
this.check_place(l);
|
||||
}
|
||||
}
|
||||
|
||||
hir::ExprKind::InlineAsm(ref asm) => {
|
||||
hir::ExprKind::InlineAsm(asm) => {
|
||||
for (op, _op_sp) in asm.operands {
|
||||
match op {
|
||||
hir::InlineAsmOperand::Out { expr, .. } => {
|
||||
|
@ -1434,7 +1434,7 @@ fn check_expr<'tcx>(this: &mut Liveness<'_, 'tcx>, expr: &'tcx Expr<'tcx>) {
|
|||
impl<'tcx> Liveness<'_, 'tcx> {
|
||||
fn check_place(&mut self, expr: &'tcx Expr<'tcx>) {
|
||||
match expr.kind {
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) => {
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(_, path)) => {
|
||||
if let Res::Local(var_hid) = path.res {
|
||||
// Assignment to an immutable variable or argument: only legal
|
||||
// if there is no later assignment. If this local is actually
|
||||
|
@ -1507,7 +1507,7 @@ impl<'tcx> Liveness<'_, 'tcx> {
|
|||
fn warn_about_unused_args(&self, body: &hir::Body<'_>, entry_ln: LiveNode) {
|
||||
for p in body.params {
|
||||
self.check_unused_vars_in_pat(
|
||||
&p.pat,
|
||||
p.pat,
|
||||
Some(entry_ln),
|
||||
Some(body),
|
||||
|spans, hir_id, ln, var| {
|
||||
|
|
|
@ -39,7 +39,7 @@ struct CheckLoopVisitor<'a, 'hir> {
|
|||
fn check_mod_loops(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
|
||||
tcx.hir().visit_item_likes_in_module(
|
||||
module_def_id,
|
||||
&mut CheckLoopVisitor { sess: &tcx.sess, hir_map: tcx.hir(), cx: Normal },
|
||||
&mut CheckLoopVisitor { sess: tcx.sess, hir_map: tcx.hir(), cx: Normal },
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -84,7 +84,7 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
|
|||
fn visit_expr(&mut self, e: &'hir hir::Expr<'hir>) {
|
||||
match e.kind {
|
||||
hir::ExprKind::Loop(ref b, _, source, _) => {
|
||||
self.with_context(Loop(source), |v| v.visit_block(&b));
|
||||
self.with_context(Loop(source), |v| v.visit_block(b));
|
||||
}
|
||||
hir::ExprKind::Closure(&hir::Closure {
|
||||
ref fn_decl,
|
||||
|
@ -98,19 +98,19 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
|
|||
} else {
|
||||
Closure(fn_decl_span)
|
||||
};
|
||||
self.visit_fn_decl(&fn_decl);
|
||||
self.visit_fn_decl(fn_decl);
|
||||
self.with_context(cx, |v| v.visit_nested_body(body));
|
||||
}
|
||||
hir::ExprKind::Block(ref b, Some(_label)) => {
|
||||
self.with_context(LabeledBlock, |v| v.visit_block(&b));
|
||||
self.with_context(LabeledBlock, |v| v.visit_block(b));
|
||||
}
|
||||
hir::ExprKind::Block(ref b, None) if matches!(self.cx, Fn) => {
|
||||
self.with_context(Normal, |v| v.visit_block(&b));
|
||||
self.with_context(Normal, |v| v.visit_block(b));
|
||||
}
|
||||
hir::ExprKind::Block(ref b, None)
|
||||
if matches!(self.cx, Normal | Constant | UnlabeledBlock(_)) =>
|
||||
{
|
||||
self.with_context(UnlabeledBlock(b.span.shrink_to_lo()), |v| v.visit_block(&b));
|
||||
self.with_context(UnlabeledBlock(b.span.shrink_to_lo()), |v| v.visit_block(b));
|
||||
}
|
||||
hir::ExprKind::Break(break_label, ref opt_expr) => {
|
||||
if let Some(e) = opt_expr {
|
||||
|
|
|
@ -211,7 +211,7 @@ impl<'tcx> CheckInlineAssembly<'tcx> {
|
|||
self.items.push((ItemKind::NonAsm, span));
|
||||
}
|
||||
|
||||
ExprKind::InlineAsm(ref asm) => {
|
||||
ExprKind::InlineAsm(asm) => {
|
||||
self.items.push((ItemKind::Asm, span));
|
||||
self.check_inline_asm(asm, span);
|
||||
}
|
||||
|
@ -282,13 +282,13 @@ impl<'tcx> Visitor<'tcx> for CheckInlineAssembly<'tcx> {
|
|||
StmtKind::Local(..) => {
|
||||
self.items.push((ItemKind::NonAsm, stmt.span));
|
||||
}
|
||||
StmtKind::Expr(ref expr) | StmtKind::Semi(ref expr) => {
|
||||
StmtKind::Expr(expr) | StmtKind::Semi(expr) => {
|
||||
self.check_expr(expr, stmt.span);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) {
|
||||
self.check_expr(&expr, expr.span);
|
||||
self.check_expr(expr, expr.span);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -158,9 +158,9 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
|||
return;
|
||||
}
|
||||
|
||||
let stab = attr::find_stability(&self.tcx.sess, attrs, item_sp);
|
||||
let const_stab = attr::find_const_stability(&self.tcx.sess, attrs, item_sp);
|
||||
let body_stab = attr::find_body_stability(&self.tcx.sess, attrs);
|
||||
let stab = attr::find_stability(self.tcx.sess, attrs, item_sp);
|
||||
let const_stab = attr::find_const_stability(self.tcx.sess, attrs, item_sp);
|
||||
let body_stab = attr::find_body_stability(self.tcx.sess, attrs);
|
||||
let mut const_span = None;
|
||||
|
||||
let const_stab = const_stab.map(|(const_stab, const_span_node)| {
|
||||
|
@ -721,8 +721,8 @@ impl<'tcx> Visitor<'tcx> for Checker<'tcx> {
|
|||
let features = self.tcx.features();
|
||||
if features.staged_api {
|
||||
let attrs = self.tcx.hir().attrs(item.hir_id());
|
||||
let stab = attr::find_stability(&self.tcx.sess, attrs, item.span);
|
||||
let const_stab = attr::find_const_stability(&self.tcx.sess, attrs, item.span);
|
||||
let stab = attr::find_stability(self.tcx.sess, attrs, item.span);
|
||||
let const_stab = attr::find_const_stability(self.tcx.sess, attrs, item.span);
|
||||
|
||||
// If this impl block has an #[unstable] attribute, give an
|
||||
// error if all involved types and traits are stable, because
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue