diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs index c50d23ff592e8..8cf39d14763b3 100644 --- a/src/librustc/middle/mem_categorization.rs +++ b/src/librustc/middle/mem_categorization.rs @@ -345,9 +345,12 @@ impl mem_categorization_ctxt { match **adjustment { ty::AutoObject(..) => { // Implicity casts a concrete object to trait object - // Result is an rvalue + // so just patch up the type let expr_ty = ty::expr_ty_adjusted(self.tcx, expr); - self.cat_rvalue_node(expr, expr_ty) + @cmt_ { + ty: expr_ty, + ..*self.cat_expr_unadjusted(expr) + } } ty::AutoAddEnv(..) => { diff --git a/src/test/compile-fail/use-after-move-implicity-coerced-object.rs b/src/test/compile-fail/use-after-move-implicity-coerced-object.rs new file mode 100644 index 0000000000000..bef6165d120a5 --- /dev/null +++ b/src/test/compile-fail/use-after-move-implicity-coerced-object.rs @@ -0,0 +1,37 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +struct Number { + n: i64 +} + +impl ToStr for Number { + fn to_str(&self) -> ~str { + self.n.to_str() + } +} + +struct List { + list: ~[~ToStr] +} + +impl List { + fn push(&mut self, n: ~ToStr) { + self.list.push(n); + } +} + +fn main() { + let n = ~Number { n: 42 }; + let mut l = ~List { list: ~[] }; + l.push(n); + //^~ NOTE: `n` moved here because it has type `~Number`, which is non-copyable (perhaps you meant to use clone()?) + let x = n.to_str(); //~ ERROR: use of moved value: `n` +}