]> git.lizzy.rs Git - rust.git/blob - src/test/ui/lint/unused_labels.rs
Auto merge of #54720 - davidtwco:issue-51191, r=nikomatsakis
[rust.git] / src / test / ui / lint / unused_labels.rs
1 // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 // The output should warn when a loop label is not used. However, it
12 // should also deal with the edge cases where a label is shadowed,
13 // within nested loops
14
15 // compile-pass
16
17 #![feature(label_break_value)]
18 #![warn(unused_labels)]
19
20 fn main() {
21     'unused_while_label: while 0 == 0 {
22         //~^ WARN unused label
23     }
24
25     let opt = Some(0);
26     'unused_while_let_label: while let Some(_) = opt {
27         //~^ WARN unused label
28     }
29
30     'unused_for_label: for _ in 0..10 {
31         //~^ WARN unused label
32     }
33
34     'used_loop_label: loop {
35         break 'used_loop_label;
36     }
37
38     'used_loop_label_outer_1: for _ in 0..10 {
39         'used_loop_label_inner_1: for _ in 0..10 {
40             break 'used_loop_label_inner_1;
41         }
42         break 'used_loop_label_outer_1;
43     }
44
45     'used_loop_label_outer_2: for _ in 0..10 {
46         'unused_loop_label_inner_2: for _ in 0..10 {
47             //~^ WARN unused label
48             break 'used_loop_label_outer_2;
49         }
50     }
51
52     'unused_loop_label_outer_3: for _ in 0..10 {
53         //~^ WARN unused label
54         'used_loop_label_inner_3: for _ in 0..10 {
55             break 'used_loop_label_inner_3;
56         }
57     }
58
59     // You should be able to break the same label many times
60     'many_used: loop {
61         if true {
62             break 'many_used;
63         } else {
64             break 'many_used;
65         }
66     }
67
68     // Test breaking many times with the same inner label doesn't break the
69     // warning on the outer label
70     'many_used_shadowed: for _ in 0..10 {
71         //~^ WARN unused label
72         'many_used_shadowed: for _ in 0..10 {
73             //~^ WARN label name `'many_used_shadowed` shadows a label name that is already in scope
74             if 1 % 2 == 0 {
75                 break 'many_used_shadowed;
76             } else {
77                 break 'many_used_shadowed;
78             }
79         }
80     }
81
82     'unused_loop_label: loop {
83         //~^ WARN unused label
84         break;
85     }
86
87     // Make sure unused block labels give warnings...
88     'unused_block_label: {
89         //~^ WARN unused label
90     }
91
92     // ...and that used ones don't:
93     'used_block_label: {
94         break 'used_block_label;
95     }
96 }