-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
auto merge of #19617 : nikomatsakis/rust/issue-19261-2, r=nrc
**First commit.** Patch up debruijn indices. Fixes #19537. **Second commit.** Stop reborrowing so much. Fixes #19147. Fixes #19261. r? @nick29581
- Loading branch information
Showing
8 changed files
with
164 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
20 changes: 20 additions & 0 deletions
20
src/test/compile-fail/borrowck-return-variable-on-stack-via-clone.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// 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. | ||
|
||
// Check that when we clone a `&T` pointer we properly relate the | ||
// lifetime of the pointer which results to the pointer being cloned. | ||
// Bugs in method resolution have sometimes broken this connection. | ||
// Issue #19261. | ||
|
||
fn leak<'a, T>(x: T) -> &'a T { | ||
(&x).clone() //~ ERROR `x` does not live long enough | ||
} | ||
|
||
fn main() { } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
// 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. | ||
|
||
// Test the case where the `Self` type has a bound lifetime that must | ||
// be adjusted in the fn signature. Issue #19537. | ||
|
||
use std::collections::HashMap; | ||
|
||
struct Foo<'a> { | ||
map: HashMap<uint, &'a str> | ||
} | ||
|
||
impl<'a> Foo<'a> { | ||
fn new() -> Foo<'a> { panic!() } | ||
fn insert(&'a mut self) { } | ||
} | ||
fn main() { | ||
let mut foo = Foo::new(); | ||
foo.insert(); | ||
foo.insert(); //~ ERROR cannot borrow | ||
} |
54 changes: 54 additions & 0 deletions
54
src/test/run-pass/method-mut-self-modifies-mut-slice-lvalue.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
// 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. | ||
|
||
// Test that an `&mut self` method, when invoked on an lvalue whose | ||
// type is `&mut [u8]`, passes in a pointer to the lvalue and not a | ||
// temporary. Issue #19147. | ||
|
||
use std::raw; | ||
use std::mem; | ||
use std::slice; | ||
use std::io::IoResult; | ||
|
||
trait MyWriter { | ||
fn my_write(&mut self, buf: &[u8]) -> IoResult<()>; | ||
} | ||
|
||
impl<'a> MyWriter for &'a mut [u8] { | ||
fn my_write(&mut self, buf: &[u8]) -> IoResult<()> { | ||
slice::bytes::copy_memory(*self, buf); | ||
|
||
let write_len = buf.len(); | ||
unsafe { | ||
*self = mem::transmute(raw::Slice { | ||
data: self.as_ptr().offset(write_len as int), | ||
len: self.len() - write_len, | ||
}); | ||
} | ||
|
||
Ok(()) | ||
} | ||
} | ||
|
||
fn main() { | ||
let mut buf = [0_u8, .. 6]; | ||
|
||
{ | ||
let mut writer = buf.as_mut_slice(); | ||
writer.my_write(&[0, 1, 2]).unwrap(); | ||
writer.my_write(&[3, 4, 5]).unwrap(); | ||
} | ||
|
||
// If `my_write` is not modifying `buf` in place, then we will | ||
// wind up with `[3, 4, 5, 0, 0, 0]` because the first call to | ||
// `my_write()` doesn't update the starting point for the write. | ||
|
||
assert_eq!(buf, [0, 1, 2, 3, 4, 5]); | ||
} |