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(..) => {
--- /dev/null
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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`
+}