From b5db97b354e5b1e1b5d99f513a40493f223fddae Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Fri, 3 Oct 2014 00:59:32 -0400 Subject: [PATCH] Add tests for `while let` --- .../compile-fail/lint-unnecessary-parens.rs | 3 +- src/test/compile-fail/while-let.rs | 37 ++++++++++++ src/test/run-pass/while-let.rs | 56 +++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/test/compile-fail/while-let.rs create mode 100644 src/test/run-pass/while-let.rs diff --git a/src/test/compile-fail/lint-unnecessary-parens.rs b/src/test/compile-fail/lint-unnecessary-parens.rs index 3c962ebf216..6c766dec9a3 100644 --- a/src/test/compile-fail/lint-unnecessary-parens.rs +++ b/src/test/compile-fail/lint-unnecessary-parens.rs @@ -9,7 +9,7 @@ // except according to those terms. #![deny(unnecessary_parens)] -#![feature(if_let)] +#![feature(if_let,while_let)] #[deriving(Eq, PartialEq)] struct X { y: bool } @@ -34,6 +34,7 @@ fn main() { _ => {} } if let 1i = (1i) {} //~ ERROR unnecessary parentheses around `if let` head expression + while let 1i = (2i) {} //~ ERROR unnecessary parentheses around `while let` head expression let v = X { y: false }; // struct lits needs parens, so these shouldn't warn. if (v == X { y: true }) {} diff --git a/src/test/compile-fail/while-let.rs b/src/test/compile-fail/while-let.rs new file mode 100644 index 00000000000..0dd442ec3f6 --- /dev/null +++ b/src/test/compile-fail/while-let.rs @@ -0,0 +1,37 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(macro_rules,while_let)] + +fn macros() { + macro_rules! foo{ + ($p:pat, $e:expr, $b:block) => {{ + while let $p = $e $b + }} + } + macro_rules! bar{ + ($p:pat, $e:expr, $b:block) => {{ + foo!($p, $e, $b) + }} + } + + foo!(a, 1i, { //~ ERROR irrefutable while-let + println!("irrefutable pattern"); + }); + bar!(a, 1i, { //~ ERROR irrefutable while-let + println!("irrefutable pattern"); + }); +} + +pub fn main() { + while let a = 1i { //~ ERROR irrefutable while-let + println!("irrefutable pattern"); + } +} diff --git a/src/test/run-pass/while-let.rs b/src/test/run-pass/while-let.rs new file mode 100644 index 00000000000..41f54d47ad4 --- /dev/null +++ b/src/test/run-pass/while-let.rs @@ -0,0 +1,56 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(while_let)] + +use std::collections::PriorityQueue; + +fn make_pq() -> PriorityQueue { + PriorityQueue::from_vec(vec![1i,2,3]) +} + +pub fn main() { + let mut pq = make_pq(); + let mut sum = 0i; + while let Some(x) = pq.pop() { + sum += x; + } + assert_eq!(sum, 6i); + + pq = make_pq(); + sum = 0; + 'a: while let Some(x) = pq.pop() { + sum += x; + if x == 2 { + break 'a; + } + } + assert_eq!(sum, 5i); + + pq = make_pq(); + sum = 0; + 'a: while let Some(x) = pq.pop() { + if x == 3 { + continue 'a; + } + sum += x; + } + assert_eq!(sum, 3i); + + let mut pq1 = make_pq(); + sum = 0; + while let Some(x) = pq1.pop() { + let mut pq2 = make_pq(); + while let Some(y) = pq2.pop() { + sum += x * y; + } + } + assert_eq!(sum, 6i + 12 + 18); +}