From 4da796f1f47505dc72ba5b375572ecf1a4607e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Tue, 6 Oct 2015 22:45:56 +0200 Subject: [PATCH] Fix reborrows of &mut pointers Fixes #28839 --- src/librustc_typeck/check/coercion.rs | 4 ---- ...orrowck-loan-of-static-data-issue-27616.rs | 2 +- src/test/run-pass/issue-28839.rs | 24 +++++++++++++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 src/test/run-pass/issue-28839.rs diff --git a/src/librustc_typeck/check/coercion.rs b/src/librustc_typeck/check/coercion.rs index 30b4cd01ade..69efaa792fe 100644 --- a/src/librustc_typeck/check/coercion.rs +++ b/src/librustc_typeck/check/coercion.rs @@ -110,10 +110,6 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> { a, b); - if a == b { - return Ok(None); - } - // Consider coercing the subtype to a DST let unsize = self.unpack_actual_value(a, |a| { self.coerce_unsized(a, b) diff --git a/src/test/compile-fail/borrowck-loan-of-static-data-issue-27616.rs b/src/test/compile-fail/borrowck-loan-of-static-data-issue-27616.rs index 4dbab986881..228e71025fd 100644 --- a/src/test/compile-fail/borrowck-loan-of-static-data-issue-27616.rs +++ b/src/test/compile-fail/borrowck-loan-of-static-data-issue-27616.rs @@ -23,7 +23,7 @@ fn evil(mut s: &'static mut String) let alias: &'static mut String = s; let inner: &str = &alias; // free value - *s = String::new(); //~ ERROR use of moved value + *s = String::new(); //~ ERROR cannot assign let _spray = "0wned".to_owned(); // ... and then use it println!("{}", inner); diff --git a/src/test/run-pass/issue-28839.rs b/src/test/run-pass/issue-28839.rs new file mode 100644 index 00000000000..a1012296626 --- /dev/null +++ b/src/test/run-pass/issue-28839.rs @@ -0,0 +1,24 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// ignore-pretty : (#23623) problems with newlines before // comments + +pub struct Foo; + +pub fn get_foo2<'a>(foo: &'a mut Option<&'a mut Foo>) -> &'a mut Foo { + match foo { + // Ensure that this is not considered a move, but rather a reborrow. + &mut Some(ref mut x) => *x, + &mut None => panic!(), + } +} + +fn main() { +}