From 3a31576d76f5cab4554da5b511f4a065bf5f92b5 Mon Sep 17 00:00:00 2001 From: llogiq Date: Mon, 1 Feb 2016 20:37:07 +0100 Subject: [PATCH] fixed #606 --- src/escape.rs | 8 ++++---- tests/compile-fail/escape_analysis.rs | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/escape.rs b/src/escape.rs index edc7b5c6fbbd..68dd2307e3fe 100644 --- a/src/escape.rs +++ b/src/escape.rs @@ -31,9 +31,9 @@ pub struct EscapePass; /// ``` declare_lint!(pub BOXED_LOCAL, Warn, "using Box where unnecessary"); -fn is_box(ty: ty::Ty) -> bool { +fn is_non_trait_box(ty: ty::Ty) -> bool { match ty.sty { - ty::TyBox(..) => true, + ty::TyBox(ref inner) => !inner.is_trait(), _ => false } } @@ -90,7 +90,7 @@ impl<'a, 'tcx: 'a> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> { if let Some(NodeExpr(..)) = map.find(map.get_parent_node(consume_pat.id)) { return; } - if is_box(cmt.ty) { + if is_non_trait_box(cmt.ty) { self.set.insert(consume_pat.id); } return; @@ -101,7 +101,7 @@ impl<'a, 'tcx: 'a> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> { if let DeclLocal(ref loc) = decl.node { if let Some(ref ex) = loc.init { if let ExprBox(..) = ex.node { - if is_box(cmt.ty) { + if is_non_trait_box(cmt.ty) { // let x = box (...) self.set.insert(consume_pat.id); } diff --git a/tests/compile-fail/escape_analysis.rs b/tests/compile-fail/escape_analysis.rs index f3aa8bff41c2..c0893bcd767b 100644 --- a/tests/compile-fail/escape_analysis.rs +++ b/tests/compile-fail/escape_analysis.rs @@ -11,9 +11,24 @@ impl A { fn foo(&self){} } +trait Z { + fn bar(&self); +} + +impl Z for A { + fn bar(&self) { + //nothing + } +} + fn main() { } +fn ok_box_trait(boxed_trait: &Box) { + let boxed_local = boxed_trait; + // done +} + fn warn_call() { let x = box A; //~ ERROR local variable x.foo();