diff options
| author | Simonas Kazlauskas <git@kazlauskas.me> | 2016-01-19 23:35:32 +0200 |
|---|---|---|
| committer | Simonas Kazlauskas <git@kazlauskas.me> | 2016-01-20 13:28:25 +0200 |
| commit | 8877cca190b4ddf3386092fa3bb84431b9d6cabd (patch) | |
| tree | 5a7f9bb7acae508b38e9a0dbd11faa773838d7aa | |
| parent | f9f6e3ad109a70428df197343c54f8a3f421a361 (diff) | |
| download | rust-8877cca190b4ddf3386092fa3bb84431b9d6cabd.tar.gz rust-8877cca190b4ddf3386092fa3bb84431b9d6cabd.zip | |
Add tests for various diverging & converging loops
Mostly testing borrowck and typeck behaviour in presence of `loop` expression
| -rw-r--r-- | src/test/compile-fail/loop-does-not-diverge.rs | 1 | ||||
| -rw-r--r-- | src/test/compile-fail/loop-proper-liveness.rs | 42 | ||||
| -rw-r--r-- | src/test/compile-fail/loop-properly-diverging-2.rs | 16 | ||||
| -rw-r--r-- | src/test/compile-fail/loop-properly-diverging.rs | 15 |
4 files changed, 73 insertions, 1 deletions
diff --git a/src/test/compile-fail/loop-does-not-diverge.rs b/src/test/compile-fail/loop-does-not-diverge.rs index cd320ba148a..451b30629b6 100644 --- a/src/test/compile-fail/loop-does-not-diverge.rs +++ b/src/test/compile-fail/loop-does-not-diverge.rs @@ -18,5 +18,4 @@ fn forever() -> ! { } fn main() { - if 1 == 2 { forever(); } } diff --git a/src/test/compile-fail/loop-proper-liveness.rs b/src/test/compile-fail/loop-proper-liveness.rs new file mode 100644 index 00000000000..e411313c273 --- /dev/null +++ b/src/test/compile-fail/loop-proper-liveness.rs @@ -0,0 +1,42 @@ +// 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. + +fn test1() { + // In this test the outer 'a loop may terminate without `x` getting initialised. Although the + // `x = loop { ... }` statement is reached, the value itself ends up never being computed and + // thus leaving `x` uninit. + let x: i32; + 'a: loop { + x = loop { break 'a }; + } + println!("{:?}", x); //~ ERROR use of possibly uninitialized variable +} + +// test2 and test3 should not fail. +fn test2() { + // In this test the `'a` loop will never terminate thus making the use of `x` unreachable. + let x: i32; + 'a: loop { + x = loop { continue 'a }; + } + println!("{:?}", x); +} + +fn test3() { + let x: i32; + // Similarly, the use of variable `x` is unreachable. + 'a: loop { + x = loop { return }; + } + println!("{:?}", x); +} + +fn main() { +} diff --git a/src/test/compile-fail/loop-properly-diverging-2.rs b/src/test/compile-fail/loop-properly-diverging-2.rs new file mode 100644 index 00000000000..c22091ce63c --- /dev/null +++ b/src/test/compile-fail/loop-properly-diverging-2.rs @@ -0,0 +1,16 @@ +// 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. + +fn forever2() -> i32 { + let x: i32 = loop { break }; //~ ERROR mismatched types + x +} + +fn main() {} diff --git a/src/test/compile-fail/loop-properly-diverging.rs b/src/test/compile-fail/loop-properly-diverging.rs new file mode 100644 index 00000000000..01dfbcc1b9e --- /dev/null +++ b/src/test/compile-fail/loop-properly-diverging.rs @@ -0,0 +1,15 @@ +// 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. + +fn forever2() -> ! { //~ ERROR computation may converge in a function marked as diverging + loop { break } +} + +fn main() {} |
