| ... | ... | @@ -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#} |