Skip to content

Commit

Permalink
Warn write-only fields
Browse files Browse the repository at this point in the history
  • Loading branch information
sanxiyn committed Jan 28, 2021
1 parent 0e19020 commit d3c69a4
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 0 deletions.
19 changes: 19 additions & 0 deletions compiler/rustc_passes/src/dead.rs
Expand Up @@ -37,6 +37,19 @@ fn should_explore(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> bool {
)
}

fn base_expr<'a>(expr: &'a hir::Expr<'a>) -> &'a hir::Expr<'a> {
let mut current = expr;
loop {
match current.kind {
hir::ExprKind::Field(base, ..) => {
current = base;
}
_ => break,
}
}
current
}

struct MarkSymbolVisitor<'tcx> {
worklist: Vec<hir::HirId>,
tcx: TyCtxt<'tcx>,
Expand Down Expand Up @@ -263,6 +276,12 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
hir::ExprKind::MethodCall(..) => {
self.lookup_and_handle_method(expr.hir_id);
}
hir::ExprKind::Assign(ref left, ref right, ..) => {
// Ignore write to field
self.visit_expr(base_expr(left));
self.visit_expr(right);
return;
}
hir::ExprKind::Field(ref lhs, ..) => {
self.handle_field_access(&lhs, expr.hir_id);
}
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/borrowck/borrowck-assign-to-subfield.rs
@@ -1,5 +1,6 @@
// run-pass
// pretty-expanded FIXME #23616
#![allow(dead_code)]

pub fn main() {
struct A {
Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/lint/dead-code/write-only-field.rs
@@ -0,0 +1,20 @@
#![deny(dead_code)]

struct S {
f: i32, //~ ERROR: field is never read
sub: Sub, //~ ERROR: field is never read
}

struct Sub {
f: i32, //~ ERROR: field is never read
}

fn field_write(s: &mut S) {
s.f = 1;
s.sub.f = 2;
}

fn main() {
let mut s = S { f: 0, sub: Sub { f: 0 } };
field_write(&mut s);
}
26 changes: 26 additions & 0 deletions src/test/ui/lint/dead-code/write-only-field.stderr
@@ -0,0 +1,26 @@
error: field is never read: `f`
--> $DIR/write-only-field.rs:4:5
|
LL | f: i32,
| ^^^^^^
|
note: the lint level is defined here
--> $DIR/write-only-field.rs:1:9
|
LL | #![deny(dead_code)]
| ^^^^^^^^^

error: field is never read: `sub`
--> $DIR/write-only-field.rs:5:5
|
LL | sub: Sub,
| ^^^^^^^^

error: field is never read: `f`
--> $DIR/write-only-field.rs:9:5
|
LL | f: i32,
| ^^^^^^

error: aborting due to 3 previous errors

0 comments on commit d3c69a4

Please sign in to comment.