Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

const expression can borrow static items #1610

Merged
merged 1 commit into from
Dec 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/const_eval.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,12 @@ r[const-eval.const-expr.path-item]
Recursively defining constants is not allowed.

r[const-eval.const-expr.path-static]
* Paths to [statics]. These are only allowed within the initializer of a static.
* Paths to [statics] with these restrictions:
* Writes to `static` items are not allowed in any constant evaluation context.
* Reads from `extern` statics are not allowed in any constant evaluation context.
* If the evaluation is *not* carried out in an initializer of a `static` item, then reads from any mutable `static` are not allowed. A mutable `static` is a `static mut` item, or a `static` item with an interior-mutable type.

These requirements are checked only when the constant is evaluated. In other words, having such accesses syntactically occur in const contexts is allowed as long as they never get executed.

r[const-eval.const-expr.tuple]
* [Tuple expressions].
Expand Down Expand Up @@ -177,6 +182,7 @@ of whether you are building on a `64` bit or a `32` bit system.
[enum discriminants]: items/enumerations.md#discriminants
[expression statements]: statements.md#expression-statements
[expressions]: expressions.md
[`extern` statics]: items/external-blocks.md#statics
[field]: expressions/field-expr.md
[functions]: items/functions.md
[grouped]: expressions/grouped-expr.md
Expand Down
3 changes: 3 additions & 0 deletions src/items/constant-items.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ const BITS_N_STRINGS: BitsNStrings<'static> = BitsNStrings {
};
```

r[items.const.final-value-immutable]
The final value of a `const` item cannot contain references to anything mutable.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should probably get some r label.

Suggested change
The final value of a `const` item cannot contain references to anything mutable.
r[items.const.final-value-immutable]
The final value of a `const` item cannot contain references to anything mutable.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied


r[items.const.expr-omission]
The constant expression may only be omitted in a [trait definition].

Expand Down
7 changes: 2 additions & 5 deletions src/items/static-items.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,7 @@ All access to a static is safe, but there are a number of restrictions on
statics:

r[items.static.sync]
* The type must have the `Sync` trait bound to allow thread-safe access.

r[items.static.const]
* Constants cannot refer to statics.
* The type must have the [`Sync`](std::marker::Sync) trait bound to allow thread-safe access.

r[items.static.init.omission]
The initializer expression must be omitted in an [external block], and must be
Expand Down Expand Up @@ -159,7 +156,7 @@ It can be confusing whether or not you should use a constant item or a static
item. Constants should, in general, be preferred over statics unless one of the
following are true:

* Large amounts of data are being stored
* Large amounts of data are being stored.
* The single-address property of statics is required.
* Interior mutability is required.

Expand Down
Loading