about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2015-09-09 16:04:55 -0400
committerNiko Matsakis <niko@alum.mit.edu>2015-09-09 16:04:55 -0400
commit01de381b4883a960ec28e2929eb08334952a57c8 (patch)
tree9b4fe2eebab28fc093db78d912d7e82661f4eeda
parent474ad2fc72735a5f12f1b9d92bf32ffc38547e0a (diff)
downloadrust-01de381b4883a960ec28e2929eb08334952a57c8.tar.gz
rust-01de381b4883a960ec28e2929eb08334952a57c8.zip
Treat loans of 'static data as extending to the end of the enclosing
fn. Fixes #27616.
-rw-r--r--src/librustc_borrowck/borrowck/gather_loans/mod.rs12
-rw-r--r--src/test/borrowck-loan-of-static-data-issue-27616.rs34
2 files changed, 35 insertions, 11 deletions
diff --git a/src/librustc_borrowck/borrowck/gather_loans/mod.rs b/src/librustc_borrowck/borrowck/gather_loans/mod.rs
index 505c66593f5..56cd7e5eaa8 100644
--- a/src/librustc_borrowck/borrowck/gather_loans/mod.rs
+++ b/src/librustc_borrowck/borrowck/gather_loans/mod.rs
@@ -364,17 +364,7 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
 
                     ty::ReFree(ref fr) => fr.scope,
 
-                    ty::ReStatic => {
-                        // If we get here, an error must have been
-                        // reported in
-                        // `lifetime::guarantee_lifetime()`, because
-                        // the only legal ways to have a borrow with a
-                        // static lifetime should not require
-                        // restrictions. To avoid reporting derived
-                        // errors, we just return here without adding
-                        // any loans.
-                        return;
-                    }
+                    ty::ReStatic => self.item_ub,
 
                     ty::ReEmpty |
                     ty::ReLateBound(..) |
diff --git a/src/test/borrowck-loan-of-static-data-issue-27616.rs b/src/test/borrowck-loan-of-static-data-issue-27616.rs
new file mode 100644
index 00000000000..228e71025fd
--- /dev/null
+++ b/src/test/borrowck-loan-of-static-data-issue-27616.rs
@@ -0,0 +1,34 @@
+// 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.
+
+use std::mem;
+
+fn leak<T>(mut b: Box<T>) -> &'static mut T {
+    // isn't this supposed to be safe?
+    let inner = &mut *b as *mut _;
+    mem::forget(b);
+    unsafe { &mut *inner }
+}
+
+fn evil(mut s: &'static mut String)
+{
+    // create alias
+    let alias: &'static mut String = s;
+    let inner: &str = &alias;
+    // free value
+    *s = String::new(); //~ ERROR cannot assign
+    let _spray = "0wned".to_owned();
+    // ... and then use it
+    println!("{}", inner);
+}
+
+fn main() {
+    evil(leak(Box::new("hello".to_owned())));
+}