handle tuple struct ctors
This commit is contained in:
parent
584d823bf2
commit
4310edb4cb
@ -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)),
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user