3 #![allow(unused_assignments)]
5 // Test control flow to follow label_break_value semantics
6 fn label_break(a: bool, b: bool) -> u32 {
22 // Test that values can be returned
23 fn break_value(a: bool, b: bool) -> u32 {
24 let result = 'block: {
25 if a { break 'block 1; }
26 if b { break 'block 2; }
32 // Test nesting of labeled blocks
33 // here we only check that it compiles
34 fn label_break_nested() {
53 // Tests for mixing labeled blocks with loop constructs
54 // This function should be the identity function
55 fn label_break_mixed(v: u32) -> u32 {
58 // Unlabeled break still works
59 // (only crossing boundaries is an error)
66 // Labeled breaking an inner loop still works
77 // Labeled breaking an outer loop still works
91 // Here we test return from inside a labeled block
97 fn label_break_match(c: u8, xe: u8, ye: i8) {
102 v if { if v % 2 == 0 { break 'a 1; }; v % 3 == 0 } => { x += 1; },
103 v if { 'b: { break 'b v == 5; } } => { x = 41; },
116 #[allow(unused_labels)]
117 fn label_break_macro() {
119 ($target:lifetime, $val:expr) => {
142 assert_eq!(label_break(true, false), 1);
143 assert_eq!(label_break(false, true), 2);
144 assert_eq!(label_break(false, false), 3);
146 assert_eq!(break_value(true, false), 1);
147 assert_eq!(break_value(false, true), 2);
148 assert_eq!(break_value(false, false), 3);
150 assert_eq!(label_break_mixed(0), 0);
151 assert_eq!(label_break_mixed(1), 1);
152 assert_eq!(label_break_mixed(2), 2);
153 assert_eq!(label_break_mixed(3), 3);
154 assert_eq!(label_break_mixed(4), 4);
155 assert_eq!(label_break_mixed(5), 5);
156 assert_eq!(label_break_mixed(6), 6);
158 label_break_match(0, 0, 0);
159 label_break_match(1, 1, -1);
160 label_break_match(2, 0, 1);
161 label_break_match(3, 2, -1);
162 label_break_match(5, 42, -1);
163 label_break_match(7, 1, -1);