n: uint) {
debug!("walk_autoref expr={}", expr.repr(self.tcx()));
- // Match for unique trait coercions first, since we don't need the
- // call to cat_expr_autoderefd.
- match *autoref {
- ty::AutoUnsizeUniq(ty::UnsizeVtable(..)) |
- ty::AutoUnsize(ty::UnsizeVtable(..)) => {
- assert!(n == 1, format!("Expected exactly 1 deref with Uniq \
- AutoRefs, found: {}", n));
- let cmt_unadjusted =
- return_if_err!(self.mc.cat_expr_unadjusted(expr));
- self.delegate_consume(expr.id, expr.span, cmt_unadjusted);
- return;
- }
- _ => {}
- }
-
- let cmt_derefd = return_if_err!(
- self.mc.cat_expr_autoderefd(expr, n));
- debug!("walk_adjustment: cmt_derefd={}",
- cmt_derefd.repr(self.tcx()));
-
match *autoref {
ty::AutoPtr(r, m, _) => {
+ let cmt_derefd = return_if_err!(
+ self.mc.cat_expr_autoderefd(expr, n));
+ debug!("walk_adjustment: cmt_derefd={}",
+ cmt_derefd.repr(self.tcx()));
+
self.delegate.borrow(expr.id,
expr.span,
cmt_derefd,
ty::BorrowKind::from_mutbl(m),
AutoRef);
}
- ty::AutoUnsizeUniq(_) | ty::AutoUnsize(_) | ty::AutoUnsafe(..) => {}
+ ty::AutoUnsize(_) |
+ ty::AutoUnsizeUniq(_) => {
+ assert!(n == 1, format!("Expected exactly 1 deref with Uniq \
+ AutoRefs, found: {}", n));
+ let cmt_unadjusted =
+ return_if_err!(self.mc.cat_expr_unadjusted(expr));
+ self.delegate_consume(expr.id, expr.span, cmt_unadjusted);
+ }
+ ty::AutoUnsafe(..) => {
+ }
}
}
--- /dev/null
+// Copyright 2015 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.
+
+// Check that we report an error if an upcast box is moved twice.
+
+fn consume(_: Box<[i32]>) {
+}
+
+fn foo(b: Box<[i32;5]>) {
+ consume(b);
+ consume(b); //~ ERROR use of moved value
+}
+
+fn main() {
+}
--- /dev/null
+// Copyright 2015 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.
+
+// Check that we report an error if an upcast box is moved twice.
+
+trait Foo { fn dummy(&self); }
+
+fn consume(_: Box<Foo>) {
+}
+
+fn foo(b: Box<Foo+Send>) {
+ consume(b);
+ consume(b); //~ ERROR use of moved value
+}
+
+fn main() {
+}