From 8b272238f1d10c9f0a77010f0a998cd697722748 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 1 Jul 2014 11:47:21 -0700 Subject: [PATCH] test: Add tests for issue #12223, "drop allowed while active borrows still in scope". This issue was fixed by PR #12828 and #5781. All that was left was to add tests. Closes #12223. --- .../drop-with-active-borrows-1.rs | 19 +++++++++++++++++++ .../drop-with-active-borrows-2.rs | 19 +++++++++++++++++++ .../run-pass/drop-with-type-ascription-1.rs | 17 +++++++++++++++++ .../run-pass/drop-with-type-ascription-2.rs | 17 +++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 src/test/compile-fail/drop-with-active-borrows-1.rs create mode 100644 src/test/compile-fail/drop-with-active-borrows-2.rs create mode 100644 src/test/run-pass/drop-with-type-ascription-1.rs create mode 100644 src/test/run-pass/drop-with-type-ascription-2.rs diff --git a/src/test/compile-fail/drop-with-active-borrows-1.rs b/src/test/compile-fail/drop-with-active-borrows-1.rs new file mode 100644 index 0000000000000..9d5020eaee84f --- /dev/null +++ b/src/test/compile-fail/drop-with-active-borrows-1.rs @@ -0,0 +1,19 @@ +// Copyright 2012 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. + +fn main() { + let a = "".to_string(); + let b: Vec<&str> = a.as_slice().lines().collect(); + drop(a); //~ ERROR cannot move out of `a` because it is borrowed + for s in b.iter() { + println!("{}", *s); + } +} + diff --git a/src/test/compile-fail/drop-with-active-borrows-2.rs b/src/test/compile-fail/drop-with-active-borrows-2.rs new file mode 100644 index 0000000000000..2700ceff68a07 --- /dev/null +++ b/src/test/compile-fail/drop-with-active-borrows-2.rs @@ -0,0 +1,19 @@ +// Copyright 2012 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. + +fn read_lines_borrowed() -> Vec<&str> { + let raw_lines: Vec = vec!("foo ".to_string(), " bar".to_string()); + raw_lines.iter().map(|l| l.as_slice().trim()).collect() + //~^ ERROR `raw_lines` does not live long enough +} + +fn main() { + println!("{}", read_lines_borrowed()); +} diff --git a/src/test/run-pass/drop-with-type-ascription-1.rs b/src/test/run-pass/drop-with-type-ascription-1.rs new file mode 100644 index 0000000000000..c4ea169cb797a --- /dev/null +++ b/src/test/run-pass/drop-with-type-ascription-1.rs @@ -0,0 +1,17 @@ +// Copyright 2012 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. + +fn main() { + let foo = "hello".to_string(); + let foo: Vec<&str> = foo.as_slice().words().collect(); + let invalid_string = foo.get(0); + assert_eq!(*invalid_string, "hello"); +} + diff --git a/src/test/run-pass/drop-with-type-ascription-2.rs b/src/test/run-pass/drop-with-type-ascription-2.rs new file mode 100644 index 0000000000000..634b1004e5308 --- /dev/null +++ b/src/test/run-pass/drop-with-type-ascription-2.rs @@ -0,0 +1,17 @@ +// Copyright 2012 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. + +fn main() { + let args = vec!("foobie", "asdf::asdf"); + let arr: Vec<&str> = args.get(1).as_slice().split_str("::").collect(); + assert_eq!(*arr.get(0), "asdf"); + assert_eq!(*arr.get(0), "asdf"); +} +