about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2020-05-31 09:54:25 +0200
committerRalf Jung <post@ralfj.de>2020-06-22 09:19:08 +0200
commit50d7deac4de3bfde44a634ff4dabf3115f694c79 (patch)
tree07dbfb20b7dac5b59dd20ebcd2624b16883acb58
parent810f309ff30fe7a75917f9e5359074dc991b4590 (diff)
downloadrust-50d7deac4de3bfde44a634ff4dabf3115f694c79.tar.gz
rust-50d7deac4de3bfde44a634ff4dabf3115f694c79.zip
prepare visit_statement for checking more kinds of statements
-rw-r--r--src/librustc_mir/transform/validate.rs53
1 files changed, 28 insertions, 25 deletions
diff --git a/src/librustc_mir/transform/validate.rs b/src/librustc_mir/transform/validate.rs
index 3d48a2387a8..051ce9e6b1e 100644
--- a/src/librustc_mir/transform/validate.rs
+++ b/src/librustc_mir/transform/validate.rs
@@ -133,34 +133,37 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
     }
 
     fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) {
-        if let StatementKind::Assign(box (dest, rvalue)) = &statement.kind {
-            // LHS and RHS of the assignment must have the same type.
-            let left_ty = dest.ty(&self.body.local_decls, self.tcx).ty;
-            let right_ty = rvalue.ty(&self.body.local_decls, self.tcx);
-            if !mir_assign_valid_types(self.tcx, right_ty, left_ty) {
-                self.fail(
-                    location,
-                    format!(
-                        "encountered `Assign` statement with incompatible types:\n\
-                        left-hand side has type: {}\n\
-                        right-hand side has type: {}",
-                        left_ty, right_ty,
-                    ),
-                );
-            }
-            // The sides of an assignment must not alias. Currently this just checks whether the places
-            // are identical.
-            match rvalue {
-                Rvalue::Use(Operand::Copy(src) | Operand::Move(src)) => {
-                    if dest == src {
-                        self.fail(
-                            location,
-                            "encountered `Assign` statement with overlapping memory",
-                        );
+        match &statement.kind {
+            StatementKind::Assign(box (dest, rvalue)) => {
+                // LHS and RHS of the assignment must have the same type.
+                let left_ty = dest.ty(&self.body.local_decls, self.tcx).ty;
+                let right_ty = rvalue.ty(&self.body.local_decls, self.tcx);
+                if !mir_assign_valid_types(self.tcx, right_ty, left_ty) {
+                    self.fail(
+                        location,
+                        format!(
+                            "encountered `Assign` statement with incompatible types:\n\
+                            left-hand side has type: {}\n\
+                            right-hand side has type: {}",
+                            left_ty, right_ty,
+                        ),
+                    );
+                }
+                // The sides of an assignment must not alias. Currently this just checks whether the places
+                // are identical.
+                match rvalue {
+                    Rvalue::Use(Operand::Copy(src) | Operand::Move(src)) => {
+                        if dest == src {
+                            self.fail(
+                                location,
+                                "encountered `Assign` statement with overlapping memory",
+                            );
+                        }
                     }
+                    _ => {}
                 }
-                _ => {}
             }
+            _ => {}
         }
     }