Skip to content

Commit 048f506

Browse files
committed
langref: document labeled blocks, labeled for, labeled while
closes #1327
1 parent fb6d385 commit 048f506

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

doc/langref.html.in

+86
Original file line numberDiff line numberDiff line change
@@ -2179,6 +2179,39 @@ test "@tagName" {
21792179
sorts the order of the tag and union field by the largest alignment.
21802180
</p>
21812181
{#header_close#}
2182+
{#header_open|blocks#}
2183+
<p>
2184+
Blocks are used to limit the scope of variable declarations:
2185+
</p>
2186+
{#code_begin|test_err|undeclared identifier#}
2187+
test "access variable after block scope" {
2188+
{
2189+
var x: i32 = 1;
2190+
}
2191+
x += 1;
2192+
}
2193+
{#code_end#}
2194+
<p>Blocks are expressions. When labeled, <code>break</code> can be used
2195+
to return a value from the block:
2196+
</p>
2197+
{#code_begin|test#}
2198+
const std = @import("std");
2199+
const assert = std.debug.assert;
2200+
2201+
test "labeled break from labeled block expression" {
2202+
var y: i32 = 123;
2203+
2204+
const x = blk: {
2205+
y += 1;
2206+
break :blk y;
2207+
};
2208+
assert(x == 124);
2209+
assert(y == 124);
2210+
}
2211+
{#code_end#}
2212+
<p>Here, <code>blk</code> can be any name.</p>
2213+
{#see_also|Labeled while|Labeled for#}
2214+
{#header_close#}
21822215
{#header_open|switch#}
21832216
{#code_begin|test|switch#}
21842217
const assert = @import("std").debug.assert;
@@ -2374,6 +2407,28 @@ fn rangeHasNumber(begin: usize, end: usize, number: usize) bool {
23742407
} else false;
23752408
}
23762409
{#code_end#}
2410+
{#header_open|Labeled while#}
2411+
<p>When a <code>while</code> loop is labeled, it can be referenced from a <code>break</code>
2412+
or <code>continue</code> from within a nested loop:</p>
2413+
{#code_begin|test#}
2414+
test "nested break" {
2415+
outer: while (true) {
2416+
while (true) {
2417+
break :outer;
2418+
}
2419+
}
2420+
}
2421+
2422+
test "nested continue" {
2423+
var i: usize = 0;
2424+
outer: while (i < 10) : (i += 1) {
2425+
while (true) {
2426+
continue :outer;
2427+
}
2428+
}
2429+
}
2430+
{#code_end#}
2431+
{#header_close#}
23772432
{#header_open|while with Optionals#}
23782433
<p>
23792434
Just like {#link|if#} expressions, while loops can take an optional as the
@@ -2560,6 +2615,37 @@ test "for else" {
25602615
};
25612616
}
25622617
{#code_end#}
2618+
{#header_open|Labeled for#}
2619+
<p>When a <code>for</code> loop is labeled, it can be referenced from a <code>break</code>
2620+
or <code>continue</code> from within a nested loop:</p>
2621+
{#code_begin|test#}
2622+
const std = @import("std");
2623+
const assert = std.debug.assert;
2624+
2625+
test "nested break" {
2626+
var count: usize = 0;
2627+
outer: for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
2628+
for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
2629+
count += 1;
2630+
break :outer;
2631+
}
2632+
}
2633+
assert(count == 1);
2634+
}
2635+
2636+
test "nested continue" {
2637+
var count: usize = 0;
2638+
outer: for ([]i32{ 1, 2, 3, 4, 5, 6, 7, 8 }) |_| {
2639+
for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
2640+
count += 1;
2641+
continue :outer;
2642+
}
2643+
}
2644+
2645+
assert(count == 8);
2646+
}
2647+
{#code_end#}
2648+
{#header_close#}
25632649
{#header_open|inline for#}
25642650
<p>
25652651
For loops can be inlined. This causes the loop to be unrolled, which

0 commit comments

Comments
 (0)