about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2017-08-01 08:48:28 -0700
committerRalf Jung <post@ralfj.de>2017-08-01 08:48:28 -0700
commit4310edb4cb106e725bb63e05b2cba21d6bb2a85f (patch)
tree8e85338750fb446687aeba9de821727c9e91feff /src
parent584d823bf2c309cb7b40aadd9d55ecc75f7eb9fc (diff)
handle tuple struct ctors
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/transform/add_validation.rs6
-rw-r--r--src/test/mir-opt/validate_1.rs24
2 files changed, 17 insertions, 13 deletions
diff --git a/src/librustc_mir/transform/add_validation.rs b/src/librustc_mir/transform/add_validation.rs
index 6f136624f0a..578a63e44b0 100644
--- a/src/librustc_mir/transform/add_validation.rs
+++ b/src/librustc_mir/transform/add_validation.rs
@@ -128,7 +128,7 @@ fn fn_contains_unsafe<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, src: MirSource) ->
                 match tcx.hir.find(cur) {
                     Some(Node::NodeExpr(&hir::Expr { node: hir::ExprBlock(ref block), ..})) => {
                         if block_is_unsafe(&*block) {
-                            // We can bail out here.
+                            // Found an unsafe block, we can bail out here.
                             return true;
                         }
                     }
@@ -138,6 +138,10 @@ fn fn_contains_unsafe<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, src: MirSource) ->
             // Finally, visit the closure itself.
             finder.visit_expr(item);
         }
+        Some(Node::NodeStructCtor(_)) => {
+            // Auto-generated tuple struct ctor.  Cannot contain unsafe code.
+            return false;
+        },
         Some(_) | None =>
             bug!("Expected function, method or closure, found {}",
                  tcx.hir.node_to_string(fn_node_id)),
diff --git a/src/test/mir-opt/validate_1.rs b/src/test/mir-opt/validate_1.rs
index b85d9261e4a..542ba87fef4 100644
--- a/src/test/mir-opt/validate_1.rs
+++ b/src/test/mir-opt/validate_1.rs
@@ -11,7 +11,7 @@
 // ignore-tidy-linelength
 // compile-flags: -Z verbose -Z mir-emit-validate=1
 
-struct Test;
+struct Test(i32);
 
 impl Test {
     // Make sure we run the pass on a method, not just on bare functions.
@@ -20,7 +20,7 @@ impl Test {
 
 fn main() {
     let mut x = 0;
-    Test.foo(&mut x);
+    Test(0).foo(&mut x);
 
     // Also test closures
     let c = |x: &mut i32| { let y = &*x; *y };
@@ -31,29 +31,29 @@ fn main() {
 // the interesting lines of code also contain name of the source file, so we cannot test for it.
 
 // END RUST SOURCE
-// START rustc.node10.EraseRegions.after.mir
+// START rustc.node12.EraseRegions.after.mir
 //     bb0: {
 //         Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(5) => validate_1/8cd878b::{{impl}}[0]::foo[0] }, BrAnon(0)) Test, _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(5) => validate_1/8cd878b::{{impl}}[0]::foo[0] }, BrAnon(1)) mut i32]);
 //         return;
 //     }
-// END rustc.node10.EraseRegions.after.mir
-// START rustc.node21.EraseRegions.after.mir
+// END rustc.node12.EraseRegions.after.mir
+// START rustc.node23.EraseRegions.after.mir
 // fn main() -> () {
 //     bb0: {
-//         Validate(Suspend(ReScope(Misc(NodeId(30)))), [_1: i32]);
+//         Validate(Suspend(ReScope(Misc(NodeId(34)))), [_1: i32]);
 //         _6 = &ReErased mut _1;
-//         Validate(Acquire, [(*_6): i32/ReScope(Misc(NodeId(30)))]);
-//         Validate(Suspend(ReScope(Misc(NodeId(30)))), [(*_6): i32/ReScope(Misc(NodeId(30)))]);
+//         Validate(Acquire, [(*_6): i32/ReScope(Misc(NodeId(34)))]);
+//         Validate(Suspend(ReScope(Misc(NodeId(34)))), [(*_6): i32/ReScope(Misc(NodeId(34)))]);
 //         _5 = &ReErased mut (*_6);
-//         Validate(Acquire, [(*_5): i32/ReScope(Misc(NodeId(30)))]);
-//         Validate(Release, [_3: &ReScope(Misc(NodeId(30))) Test, _5: &ReScope(Misc(NodeId(30))) mut i32]);
+//         Validate(Acquire, [(*_5): i32/ReScope(Misc(NodeId(34)))]);
+//         Validate(Release, [_3: &ReScope(Misc(NodeId(34))) Test, _5: &ReScope(Misc(NodeId(34))) mut i32]);
 //         _2 = const Test::foo(_3, _5) -> bb1;
 //     }
 //
 //     bb1: {
 //         Validate(Acquire, [_2: ()]);
-//         EndRegion(ReScope(Misc(NodeId(30))));
+//         EndRegion(ReScope(Misc(NodeId(34))));
 //         return;
 //     }
 // }
-// END rustc.node21.EraseRegions.after.mir
+// END rustc.node23.EraseRegions.after.mir