@@ -6144,7 +6144,14 @@ fn assert(ok: bool) void {
6144
6144
if (!ok) unreachable; // assertion failure
6145
6145
}
6146
6146
{#code_end#}
6147
- <p>At runtime crashes with the message <code>reached unreachable code</code> and a stack trace.</p>
6147
+ <p>At runtime:</p>
6148
+ {#code_begin|exe_err#}
6149
+ const std = @import("std");
6150
+
6151
+ pub fn main() void {
6152
+ std.debug.assert(false);
6153
+ }
6154
+ {#code_end#}
6148
6155
{#header_close#}
6149
6156
{#header_open|Index out of Bounds#}
6150
6157
<p>At compile-time:</p>
@@ -6154,7 +6161,16 @@ comptime {
6154
6161
const garbage = array[5];
6155
6162
}
6156
6163
{#code_end#}
6157
- <p>At runtime crashes with the message <code>index out of bounds</code> and a stack trace.</p>
6164
+ <p>At runtime:</p>
6165
+ {#code_begin|exe_err#}
6166
+ pub fn main() void {
6167
+ var x = foo("hello");
6168
+ }
6169
+
6170
+ fn foo(x: []const u8) u8 {
6171
+ return x[5];
6172
+ }
6173
+ {#code_end#}
6158
6174
{#header_close#}
6159
6175
{#header_open|Cast Negative Number to Unsigned Integer#}
6160
6176
<p>At compile-time:</p>
@@ -6164,10 +6180,18 @@ comptime {
6164
6180
const unsigned = @intCast(u32, value);
6165
6181
}
6166
6182
{#code_end#}
6167
- <p>At runtime crashes with the message <code>attempt to cast negative value to unsigned integer</code> and a stack trace.</p>
6183
+ <p>At runtime:</p>
6184
+ {#code_begin|exe_err#}
6185
+ const std = @import("std");
6186
+
6187
+ pub fn main() void {
6188
+ var value: i32 = -1;
6189
+ var unsigned = @intCast(u32, value);
6190
+ std.debug.warn("value: {}\n", unsigned);
6191
+ }
6192
+ {#code_end#}
6168
6193
<p>
6169
- If you are trying to obtain the maximum value of an unsigned integer, use <code>@maxValue(T)</code>,
6170
- where <code>T</code> is the integer type, such as <code>u32</code>.
6194
+ To obtain the maximum value of an unsigned integer, use {#link|@maxValue#}.
6171
6195
</p>
6172
6196
{#header_close#}
6173
6197
{#header_open|Cast Truncates Data#}
@@ -6178,11 +6202,18 @@ comptime {
6178
6202
const byte = @intCast(u8, spartan_count);
6179
6203
}
6180
6204
{#code_end#}
6181
- <p>At runtime crashes with the message <code>integer cast truncated bits</code> and a stack trace.</p>
6205
+ <p>At runtime:</p>
6206
+ {#code_begin|exe_err#}
6207
+ const std = @import("std");
6208
+
6209
+ pub fn main() void {
6210
+ var spartan_count: u16 = 300;
6211
+ const byte = @intCast(u8, spartan_count);
6212
+ std.debug.warn("value: {}\n", byte);
6213
+ }
6214
+ {#code_end#}
6182
6215
<p>
6183
- If you are trying to truncate bits, use <code>@truncate(T, value)</code>,
6184
- where <code>T</code> is the integer type, such as <code>u32</code>, and <code>value</code>
6185
- is the value you want to truncate.
6216
+ To truncate bits, use {#link|@truncate#}.
6186
6217
</p>
6187
6218
{#header_close#}
6188
6219
{#header_open|Integer Overflow#}
@@ -6194,9 +6225,9 @@ comptime {
6194
6225
<li><code>-</code> (negation)</li>
6195
6226
<li><code>*</code> (multiplication)</li>
6196
6227
<li><code>/</code> (division)</li>
6197
- <li><code> @divTrunc</code> (division)</li>
6198
- <li><code> @divFloor</code> (division)</li>
6199
- <li><code> @divExact</code> (division)</li>
6228
+ <li>{#link| @divTrunc#} (division)</li>
6229
+ <li>{#link| @divFloor#} (division)</li>
6230
+ <li>{#link| @divExact#} (division)</li>
6200
6231
</ul>
6201
6232
<p>Example with addition at compile-time:</p>
6202
6233
{#code_begin|test_err|operation caused overflow#}
@@ -6205,7 +6236,16 @@ comptime {
6205
6236
byte += 1;
6206
6237
}
6207
6238
{#code_end#}
6208
- <p>At runtime crashes with the message <code>integer overflow</code> and a stack trace.</p>
6239
+ <p>At runtime:</p>
6240
+ {#code_begin|exe_err#}
6241
+ const std = @import("std");
6242
+
6243
+ pub fn main() void {
6244
+ var byte: u8 = 255;
6245
+ byte += 1;
6246
+ std.debug.warn("value: {}\n", byte);
6247
+ }
6248
+ {#code_end#}
6209
6249
{#header_close#}
6210
6250
{#header_open|Standard Library Math Functions#}
6211
6251
<p>These functions provided by the standard library return possible errors.</p>
@@ -6240,13 +6280,13 @@ pub fn main() !void {
6240
6280
occurred, as well as returning the overflowed bits:
6241
6281
</p>
6242
6282
<ul>
6243
- <li><code> @addWithOverflow</code> </li>
6244
- <li><code> @subWithOverflow</code> </li>
6245
- <li><code> @mulWithOverflow</code> </li>
6246
- <li><code> @shlWithOverflow</code> </li>
6283
+ <li>{#link| @addWithOverflow#} </li>
6284
+ <li>{#link| @subWithOverflow#} </li>
6285
+ <li>{#link| @mulWithOverflow#} </li>
6286
+ <li>{#link| @shlWithOverflow#} </li>
6247
6287
</ul>
6248
6288
<p>
6249
- Example of <code> @addWithOverflow</code> :
6289
+ Example of {#link| @addWithOverflow#} :
6250
6290
</p>
6251
6291
{#code_begin|exe#}
6252
6292
const warn = @import("std").debug.warn;
@@ -6292,7 +6332,16 @@ comptime {
6292
6332
const x = @shlExact(u8(0b01010101), 2);
6293
6333
}
6294
6334
{#code_end#}
6295
- <p>At runtime crashes with the message <code>left shift overflowed bits</code> and a stack trace.</p>
6335
+ <p>At runtime:</p>
6336
+ {#code_begin|exe_err#}
6337
+ const std = @import("std");
6338
+
6339
+ pub fn main() void {
6340
+ var x: u8 = 0b01010101;
6341
+ var y = @shlExact(x, 2);
6342
+ std.debug.warn("value: {}\n", y);
6343
+ }
6344
+ {#code_end#}
6296
6345
{#header_close#}
6297
6346
{#header_open|Exact Right Shift Overflow#}
6298
6347
<p>At compile-time:</p>
@@ -6301,7 +6350,16 @@ comptime {
6301
6350
const x = @shrExact(u8(0b10101010), 2);
6302
6351
}
6303
6352
{#code_end#}
6304
- <p>At runtime crashes with the message <code>right shift overflowed bits</code> and a stack trace.</p>
6353
+ <p>At runtime:</p>
6354
+ {#code_begin|exe_err#}
6355
+ const std = @import("std");
6356
+
6357
+ pub fn main() void {
6358
+ var x: u8 = 0b10101010;
6359
+ var y = @shrExact(x, 2);
6360
+ std.debug.warn("value: {}\n", y);
6361
+ }
6362
+ {#code_end#}
6305
6363
{#header_close#}
6306
6364
{#header_open|Division by Zero#}
6307
6365
<p>At compile-time:</p>
@@ -6312,8 +6370,17 @@ comptime {
6312
6370
const c = a / b;
6313
6371
}
6314
6372
{#code_end#}
6315
- <p>At runtime crashes with the message <code>division by zero</code> and a stack trace.</p>
6373
+ <p>At runtime:</p>
6374
+ {#code_begin|exe_err#}
6375
+ const std = @import("std");
6316
6376
6377
+ pub fn main() void {
6378
+ var a: u32 = 1;
6379
+ var b: u32 = 0;
6380
+ var c = a / b;
6381
+ std.debug.warn("value: {}\n", c);
6382
+ }
6383
+ {#code_end#}
6317
6384
{#header_close#}
6318
6385
{#header_open|Remainder Division by Zero#}
6319
6386
<p>At compile-time:</p>
@@ -6324,14 +6391,57 @@ comptime {
6324
6391
const c = a % b;
6325
6392
}
6326
6393
{#code_end#}
6327
- <p>At runtime crashes with the message <code>remainder division by zero</code> and a stack trace.</p>
6394
+ <p>At runtime:</p>
6395
+ {#code_begin|exe_err#}
6396
+ const std = @import("std");
6328
6397
6398
+ pub fn main() void {
6399
+ var a: u32 = 10;
6400
+ var b: u32 = 0;
6401
+ var c = a % b;
6402
+ std.debug.warn("value: {}\n", c);
6403
+ }
6404
+ {#code_end#}
6329
6405
{#header_close#}
6330
6406
{#header_open|Exact Division Remainder#}
6331
- <p>TODO</p>
6407
+ <p>At compile-time:</p>
6408
+ {#code_begin|test_err|exact division had a remainder#}
6409
+ comptime {
6410
+ const a: u32 = 10;
6411
+ const b: u32 = 3;
6412
+ const c = @divExact(a, b);
6413
+ }
6414
+ {#code_end#}
6415
+ <p>At runtime:</p>
6416
+ {#code_begin|exe_err#}
6417
+ const std = @import("std");
6418
+
6419
+ pub fn main() void {
6420
+ var a: u32 = 10;
6421
+ var b: u32 = 3;
6422
+ var c = @divExact(a, b);
6423
+ std.debug.warn("value: {}\n", c);
6424
+ }
6425
+ {#code_end#}
6332
6426
{#header_close#}
6333
6427
{#header_open|Slice Widen Remainder#}
6334
- <p>TODO</p>
6428
+ <p>At compile-time:</p>
6429
+ {#code_begin|test_err|unable to convert#}
6430
+ comptime {
6431
+ var bytes = [5]u8{ 1, 2, 3, 4, 5 };
6432
+ var slice = @bytesToSlice(u32, bytes);
6433
+ }
6434
+ {#code_end#}
6435
+ <p>At runtime:</p>
6436
+ {#code_begin|exe_err#}
6437
+ const std = @import("std");
6438
+
6439
+ pub fn main() void {
6440
+ var bytes = [5]u8{ 1, 2, 3, 4, 5 };
6441
+ var slice = @bytesToSlice(u32, bytes[0..]);
6442
+ std.debug.warn("value: {}\n", slice[0]);
6443
+ }
6444
+ {#code_end#}
6335
6445
{#header_close#}
6336
6446
{#header_open|Attempt to Unwrap Null#}
6337
6447
<p>At compile-time:</p>
@@ -6341,7 +6451,16 @@ comptime {
6341
6451
const number = optional_number.?;
6342
6452
}
6343
6453
{#code_end#}
6344
- <p>At runtime crashes with the message <code>attempt to unwrap null</code> and a stack trace.</p>
6454
+ <p>At runtime:</p>
6455
+ {#code_begin|exe_err#}
6456
+ const std = @import("std");
6457
+
6458
+ pub fn main() void {
6459
+ var optional_number: ?i32 = null;
6460
+ var number = optional_number.?;
6461
+ std.debug.warn("value: {}\n", number);
6462
+ }
6463
+ {#code_end#}
6345
6464
<p>One way to avoid this crash is to test for null instead of assuming non-null, with
6346
6465
the <code>if</code> expression:</p>
6347
6466
{#code_begin|exe|test#}
@@ -6356,6 +6475,7 @@ pub fn main() void {
6356
6475
}
6357
6476
}
6358
6477
{#code_end#}
6478
+ {#see_also|Optionals#}
6359
6479
{#header_close#}
6360
6480
{#header_open|Attempt to Unwrap Error#}
6361
6481
<p>At compile-time:</p>
@@ -6368,7 +6488,19 @@ fn getNumberOrFail() !i32 {
6368
6488
return error.UnableToReturnNumber;
6369
6489
}
6370
6490
{#code_end#}
6371
- <p>At runtime crashes with the message <code>attempt to unwrap error: ErrorCode</code> and a stack trace.</p>
6491
+ <p>At runtime:</p>
6492
+ {#code_begin|exe_err#}
6493
+ const std = @import("std");
6494
+
6495
+ pub fn main() void {
6496
+ const number = getNumberOrFail() catch unreachable;
6497
+ std.debug.warn("value: {}\n", number);
6498
+ }
6499
+
6500
+ fn getNumberOrFail() !i32 {
6501
+ return error.UnableToReturnNumber;
6502
+ }
6503
+ {#code_end#}
6372
6504
<p>One way to avoid this crash is to test for an error instead of assuming a successful result, with
6373
6505
the <code>if</code> expression:</p>
6374
6506
{#code_begin|exe#}
@@ -6388,6 +6520,7 @@ fn getNumberOrFail() !i32 {
6388
6520
return error.UnableToReturnNumber;
6389
6521
}
6390
6522
{#code_end#}
6523
+ {#see_also|Errors#}
6391
6524
{#header_close#}
6392
6525
{#header_open|Invalid Error Code#}
6393
6526
<p>At compile-time:</p>
@@ -6398,11 +6531,47 @@ comptime {
6398
6531
const invalid_err = @intToError(number);
6399
6532
}
6400
6533
{#code_end#}
6401
- <p>At runtime crashes with the message <code>invalid error code</code> and a stack trace.</p>
6534
+ <p>At runtime:</p>
6535
+ {#code_begin|exe_err#}
6536
+ const std = @import("std");
6537
+
6538
+ pub fn main() void {
6539
+ var err = error.AnError;
6540
+ var number = @errorToInt(err) + 500;
6541
+ var invalid_err = @intToError(number);
6542
+ std.debug.warn("value: {}\n", number);
6543
+ }
6544
+ {#code_end#}
6402
6545
{#header_close#}
6403
6546
{#header_open|Invalid Enum Cast#}
6404
- <p>TODO</p>
6547
+ <p>At compile-time:</p>
6548
+ {#code_begin|test_err|has no tag matching integer value 3#}
6549
+ const Foo = enum {
6550
+ A,
6551
+ B,
6552
+ C,
6553
+ };
6554
+ comptime {
6555
+ const a: u2 = 3;
6556
+ const b = @intToEnum(Foo, a);
6557
+ }
6558
+ {#code_end#}
6559
+ <p>At runtime:</p>
6560
+ {#code_begin|exe_err#}
6561
+ const std = @import("std");
6562
+
6563
+ const Foo = enum {
6564
+ A,
6565
+ B,
6566
+ C,
6567
+ };
6405
6568
6569
+ pub fn main() void {
6570
+ var a: u2 = 3;
6571
+ var b = @intToEnum(Foo, a);
6572
+ std.debug.warn("value: {}\n", @tagName(b));
6573
+ }
6574
+ {#code_end#}
6406
6575
{#header_close#}
6407
6576
6408
6577
{#header_open|Invalid Error Set Cast#}
0 commit comments