Skip to content

Commit

Permalink
document guarantee about evaluation of associated consts and const bl…
Browse files Browse the repository at this point in the history
…ocks
  • Loading branch information
RalfJung committed May 10, 2024
1 parent e356977 commit aac08bb
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/expressions/block-expr.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ Const blocks allows you to define a constant value without having to define new
It also supports type inference so there is no need to specify the type, unlike [constant items].

Const blocks have the ability to reference generic parameters in scope, unlike [free][free item] constant items.
They are desugared to associated constant items with generic parameters in scope.
They are desugared to constant items with generic parameters in scope (similar to associated constants, but without a trait or type they are associated with).
For example, this code:

```rust
Expand All @@ -152,8 +152,12 @@ fn foo<T>() -> usize {
}
```

This also means that const blocks are treated similarly to associated constants.
For example, they are not guaranteed to be evaluated when the enclosing function is unused.
If the function containing the const block is executed at runtime, then the const block is guaranteed to be evaluated.
This is true even if the const block occurs in dead code.
In particular, unsafe code inside a function can rely on the fact that all const blocks syntactically occurring in the function have successfully evaluated (and not panicked).
Note that this is only guaranteed for all currently existing syntactic constructs;
in the future, a new kind of block may be introduced such that constants inside that block are *not* unconditionally guaranteed to be evaluated.
If the function is not executed at runtime, const blocks inside of it may or may not be evaluated.

## `unsafe` blocks

Expand Down
3 changes: 3 additions & 0 deletions src/expressions/path-expr.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@ let push_integer = Vec::<i32>::push;
let slice_reverse = <[i32]>::reverse;
```

Evaluation of associated constants is handled the same way as [`const` blocks].

[_PathInExpression_]: ../paths.md#paths-in-expressions
[_QualifiedPathInExpression_]: ../paths.md#qualified-paths
[place expressions]: ../expressions.md#place-expressions-and-value-expressions
[value expressions]: ../expressions.md#place-expressions-and-value-expressions
[path]: ../paths.md
[`static mut`]: ../items/static-items.md#mutable-statics
[`unsafe` block]: block-expr.md#unsafe-blocks
[`const` blocks]: block-expr.md#const-blocks

0 comments on commit aac08bb

Please sign in to comment.