Skip to content

Conversation

@traviscross
Copy link
Contributor

@traviscross traviscross commented Nov 16, 2025

We had said that the dereference operator could not be used with raw pointers in a constant expression. However, that restriction has been lifted. First, in Rust 1.58, we stabilized
const_raw_ptr_deref.

rust-lang/rust#89551

This allowed for dereferencing immutable raw pointers in a constant expression. Then, in Rust 1.83, we stabilized const_mut_refs and const_refs_to_cell.

rust-lang/rust#129195

That allowed for:

  • Mentioning &mut types.
  • Creating &mut and *mut values.
  • Creating &T and *const T values where T contains interior mutability.
  • Dereferencing &mut and *mut values (both for reads and writes).

Let's remove the stated restriction on dereferencing raw pointers in a constant expression and add examples.

cc @ehuss @RalfJung


I noticed this when double-checking that we didn't need to do anything for:

cc @rust-lang/fls

@rustbot rustbot added the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Nov 16, 2025
@traviscross traviscross force-pushed the TC/remove-restriction-on-dereferencing-pointers-in-const branch 2 times, most recently from 3dab34b to 71865f1 Compare November 16, 2025 08:53
@traviscross traviscross force-pushed the TC/remove-restriction-on-dereferencing-pointers-in-const branch from 71865f1 to 7fb0ff8 Compare November 18, 2025 21:50
We had said that the dereference operator could not be used with raw
pointers in a constant expression.  However, that restriction has been
lifted.  First, in Rust 1.58, we stabilized `const_raw_ptr_deref`.

rust-lang/rust#89551

This allowed for dereferencing immutable raw pointers in a constant
expression.  Then, in Rust 1.83, we stabilized `const_mut_refs` and
`const_refs_to_cell`.

rust-lang/rust#129195

That allowed for:

- Mentioning `&mut` types.
- Creating `&mut` and `*mut` values.
- Creating `&T` and `*const T` values where `T` contains interior
  mutability.
- Dereferencing `&mut` and `*mut` values (both for reads and writes).

Let's remove the stated restriction on dereferencing raw pointers in a
constant expression and add examples.
To define what's allowed in a constant expression, we have a list that
starts with the text:

> The following expressions are constant expressions...

Correspondingly, most of the items in this list are stated in terms of
being a "this expression" or a "that expression".  However, for deref,
we had instead said "the dereference operator".  Even though the
`expr.deref` section is currently titled "the dereference operator",
it seems more clear and consistent in the context of this list to talk
about dereference expressions, so let's do that.  These are
expressions, after all, The grammar production is named
`DereferenceExpression`.

(There is one other place in the list that we talk about operators:
"built-in negation, arithmetic, logical, comparison, or lazy boolean
operators used on integer and floating point types, `bool`, and
`char`."  Perhaps we'll reword that one later.  It stands out a bit
less than this one did.)
@traviscross traviscross force-pushed the TC/remove-restriction-on-dereferencing-pointers-in-const branch from 7fb0ff8 to 0659e98 Compare November 18, 2025 21:52
Copy link
Contributor

@ehuss ehuss left a comment

Choose a reason for hiding this comment

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

Thanks!

@ehuss ehuss enabled auto-merge November 18, 2025 21:54
@ehuss ehuss added this pull request to the merge queue Nov 18, 2025
Merged via the queue into master with commit ef2c2f2 Nov 18, 2025
5 checks passed
@rustbot rustbot removed the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Nov 18, 2025
jhpratt added a commit to jhpratt/rust that referenced this pull request Nov 29, 2025
Update books

## rust-lang/book

2 commits in f78ab89d7545ac17780e6a367055cc089f4cd2ec..8c0eacd5c4acbb650497454f3a58c9e8083202a4
2025-11-18 15:36:41 UTC to 2025-11-18 15:33:41 UTC

- Update ch07-02-defining-modules-to-control-scope-and-privacy.md (rust-lang/book#4570)
- use AND for search terms (rust-lang/book#4573)

## rust-lang/reference

4 commits in f9f1d2a4149f02582aec2f8fcdfa5b596193b4e2..f2ac173df9906de5c03b0ee50653321ef1c4ebe8
2025-11-26 02:52:23 UTC to 2025-11-18 21:54:51 UTC

- document `cfg` conditions on inline assembly templates and operands (rust-lang/reference#2063)
- remove unused "link reference definitions" (rust-lang/reference#2092)
- Add review process overview to review-policy.md (rust-lang/reference#2088)
- Remove restriction on dereferencing pointers in const (rust-lang/reference#2090)

## rust-lang/rust-by-example

5 commits in f944161716230641605b5e3733e1c81f10047fd4..111cfae2f9c3a43f7b0ff8fa68c51cc8f930637c
2025-11-27 20:16:42 UTC to 2025-11-20 21:40:02 UTC

- Use `From::from` fn pointer to convert to boxed errors (rust-lang/rust-by-example#1906)
- link the _tuple_ page instead "TupleStruct" (rust-lang/rust-by-example#1909)
- enum_use.md: avoid an uncommon term (rust-lang/rust-by-example#1976)
- make search less surprising (rust-lang/rust-by-example#1975)
- Update documentation for `any` function in iter_any.md (rust-lang/rust-by-example#1973)
rust-timer added a commit to rust-lang/rust that referenced this pull request Nov 29, 2025
Rollup merge of #149424 - rustbot:docs-update, r=ehuss

Update books

## rust-lang/book

2 commits in f78ab89d7545ac17780e6a367055cc089f4cd2ec..8c0eacd5c4acbb650497454f3a58c9e8083202a4
2025-11-18 15:36:41 UTC to 2025-11-18 15:33:41 UTC

- Update ch07-02-defining-modules-to-control-scope-and-privacy.md (rust-lang/book#4570)
- use AND for search terms (rust-lang/book#4573)

## rust-lang/reference

4 commits in f9f1d2a4149f02582aec2f8fcdfa5b596193b4e2..f2ac173df9906de5c03b0ee50653321ef1c4ebe8
2025-11-26 02:52:23 UTC to 2025-11-18 21:54:51 UTC

- document `cfg` conditions on inline assembly templates and operands (rust-lang/reference#2063)
- remove unused "link reference definitions" (rust-lang/reference#2092)
- Add review process overview to review-policy.md (rust-lang/reference#2088)
- Remove restriction on dereferencing pointers in const (rust-lang/reference#2090)

## rust-lang/rust-by-example

5 commits in f944161716230641605b5e3733e1c81f10047fd4..111cfae2f9c3a43f7b0ff8fa68c51cc8f930637c
2025-11-27 20:16:42 UTC to 2025-11-20 21:40:02 UTC

- Use `From::from` fn pointer to convert to boxed errors (rust-lang/rust-by-example#1906)
- link the _tuple_ page instead "TupleStruct" (rust-lang/rust-by-example#1909)
- enum_use.md: avoid an uncommon term (rust-lang/rust-by-example#1976)
- make search less surprising (rust-lang/rust-by-example#1975)
- Update documentation for `any` function in iter_any.md (rust-lang/rust-by-example#1973)
ehuss added a commit to ehuss/rust that referenced this pull request Dec 11, 2025
This updates to mdbook 0.5.2 from mdbook 0.4.52. A primary aspect of
this change is that it splits the `mdbook` crate into multiple crates,
and various API changes and cleanup.

There's full release notes and a migration guide at
https://github.com/rust-lang/mdBook/blob/master/CHANGELOG.md#mdbook-050.

This also includes submodule updates:

## book

8 commits in f660f341887c8bbcd6c24fbfdf5d2a262f523965..9c9104e8a82430f97f42e738051bda718919211c
2025-10-27 21:41:51 -0400 to 2025-12-10 11:33:49 -0500
- Update to mdbook 0.5
- Update ch07-02-defining-modules-to-control-scope-and-privacy.md
- use AND for search terms
- Consistently use let...else
- Merge branch 'main' into fix-typo-17-02
- Fix typo in section 17.2
- Revert "Fix typo in section 17.2"
- Fix typo in section 17.2

## edition-guide

2 commits in 5c621253d8f2a5a4adb64a6365905db67dffe3a2..c3c0f0b3da26610138b7ba7663f60cd2c68cf184
2025-10-23 14:13:01 +0000 to 2025-11-28 18:54:18 +0000
- Update to mdbook 0.5 (rust-lang/edition-guide#381)
- Link to 1.56.0 and 1.85.0 blog posts (rust-lang/edition-guide#380)

## nomicon

6 commits in 60f0b30d8ec1c9eb5c2582f2ec55f1094b0f8c42..9fe8fa599ad228dda74f240cc32b54bc5c1aa3e6
2025-10-20 13:05:39 +0000 to 2025-12-03 11:54:04 +0000
- Remove references to outdated unsafe code guidelines (rust-lang/nomicon#512)
- Update to mdbook 0.5 (rust-lang/nomicon#511)
- Fix grammar in ffi.md (rust-lang/nomicon#510)
- Add CITATION.cff (rust-lang/nomicon#507)
- Use the newest Layout::array size checks for vec-alloc (rust-lang/nomicon#508)
- review comment: dropck analysis is *not* trivial (rust-lang/nomicon#498)

## reference

17 commits in e122eefff3fef362eb7e0c08fb7ffbf5f9461905..50c5de90487b68d429a30cc9466dc8f5b410128f
2025-10-28 20:52:27 +0000 to 2025-12-09 22:19:05 +0000
- UB: update the extra clause for provenance UB during const evaluation (rust-lang/reference#2091)
- Remove `[no-mentions]` handler in our triagebot config (rust-lang/reference#2102)
- Clarify that omitting `nostack` is a promise from the compiler to the programmer (rust-lang/reference#1999)
- Specify that range patterns must be nonempty. (rust-lang/reference#2093)
- Update to mdbook 0.5 (rust-lang/reference#2096)
- get rid of const.no-mut-refs (rust-lang/reference#2080)
- use oxford comma (rust-lang/reference#2099)
- document `cfg` conditions on inline assembly templates and operands (rust-lang/reference#2063)
- remove unused "link reference definitions" (rust-lang/reference#2092)
- Add review process overview to review-policy.md (rust-lang/reference#2088)
- Remove restriction on dereferencing pointers in const (rust-lang/reference#2090)
- add 'system' to variadic ABIs (rust-lang/reference#2069)
- Guarantee the binary representation of `isize` explicitly (rust-lang/reference#2064)
- Update `no_implicit_prelude` to use the attribute template (rust-lang/reference#1914)
- Update `no_std` to use the attribute template (rust-lang/reference#1913)
- const_eval.md: be more clear where link leads to (rust-lang/reference#2083)
- specify s390x target features (rust-lang/reference#1972)

## rust-by-example

7 commits in 160e6bbca70b0c01aa4de88d19db7fc5ff8447c3..7d21279e40e8f0e91c2a22c5148dd2d745aef8b6
2025-11-03 09:26:45 -0300 to 2025-12-01 15:02:09 -0300
- Update to mdbook 0.5 (rust-lang/rust-by-example#1977)
- Use `From::from` fn pointer to convert to boxed errors (rust-lang/rust-by-example#1906)
- link the _tuple_ page instead "TupleStruct" (rust-lang/rust-by-example#1909)
- enum_use.md: avoid an uncommon term (rust-lang/rust-by-example#1976)
- make search less surprising (rust-lang/rust-by-example#1975)
- Update documentation for `any` function in iter_any.md (rust-lang/rust-by-example#1973)
- Revise `Path` type documentation for clarity (rust-lang/rust-by-example#1972)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants