Skip to content

Commit

Permalink
Get the right place type
Browse files Browse the repository at this point in the history
  • Loading branch information
roxelo committed Jul 15, 2021
1 parent ee5ed4a commit 9fe470b
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 2 deletions.
8 changes: 6 additions & 2 deletions compiler/rustc_typeck/src/expr_use_visitor.rs
Expand Up @@ -256,12 +256,16 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
| PatKind::Path(..)
| PatKind::Struct(..)
| PatKind::Tuple(..) => {
// If the PatKind is a TupleStruct, Struct or Tuple then we want to check
// If the PatKind is a TupleStruct, Path, Struct or Tuple then we want to check
// whether the Variant is a MultiVariant or a SingleVariant. We only want
// to borrow discr if it is a MultiVariant.
// If it is a SingleVariant and creates a binding we will handle that when
// this callback gets called again.
if let ty::Adt(def, _) = place.place.base_ty.kind() {

// Get the type of the Place after all projections have been applied
let place_ty = place.place.ty();

if let ty::Adt(def, _) = place_ty.kind() {
if def.variants.len() > 1 {
needs_to_be_read = true;
}
Expand Down
35 changes: 35 additions & 0 deletions src/test/ui/closures/2229_closure_analysis/issue-87097.rs
@@ -0,0 +1,35 @@
// run-pass
// edition:2021

enum Variant {
A,
B, //~ WARNING: variant is never constructed: `B`
}

struct A {
field: Variant,
}

fn discriminant_is_a_ref() {
let here = A { field: Variant::A };
let out_ref = &here.field;

|| match out_ref { //~ WARNING: unused closure that must be used
Variant::A => (),
Variant::B => (),
};
}

fn discriminant_is_a_field() {
let here = A { field: Variant::A };

|| match here.field { //~ WARNING: unused closure that must be used
Variant::A => (),
Variant::B => (),
};
}

fn main() {
discriminant_is_a_ref();
discriminant_is_a_field();
}
33 changes: 33 additions & 0 deletions src/test/ui/closures/2229_closure_analysis/issue-87097.stderr
@@ -0,0 +1,33 @@
warning: variant is never constructed: `B`
--> $DIR/issue-87097.rs:6:5
|
LL | B,
| ^
|
= note: `#[warn(dead_code)]` on by default

warning: unused closure that must be used
--> $DIR/issue-87097.rs:17:5
|
LL | / || match out_ref {
LL | | Variant::A => (),
LL | | Variant::B => (),
LL | | };
| |______^
|
= note: `#[warn(unused_must_use)]` on by default
= note: closures are lazy and do nothing unless called

warning: unused closure that must be used
--> $DIR/issue-87097.rs:26:5
|
LL | / || match here.field {
LL | | Variant::A => (),
LL | | Variant::B => (),
LL | | };
| |______^
|
= note: closures are lazy and do nothing unless called

warning: 3 warnings emitted

0 comments on commit 9fe470b

Please sign in to comment.