-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Labels
A-raw-pointersArea: raw pointers, MaybeUninit, NonNullArea: raw pointers, MaybeUninit, NonNullB-unstableBlocker: Implemented in the nightly compiler and unstable.Blocker: Implemented in the nightly compiler and unstable.C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCCategory: An issue tracking the progress of sth. like the implementation of an RFCF-raw_ref_op`#![feature(raw_ref_op)]``#![feature(raw_ref_op)]`Libs-TrackedLibs issues that are tracked on the team's project board.Libs issues that are tracked on the team's project board.T-langRelevant to the language teamRelevant to the language teamT-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.Relevant to the library API team, which will review and decide on the PR/issue.disposition-mergeThis issue / PR is in PFCP or FCP with a disposition to merge it.This issue / PR is in PFCP or FCP with a disposition to merge it.finished-final-comment-periodThe final comment period is finished for this PR / Issue.The final comment period is finished for this PR / Issue.
Description
This is a tracking issue for the macro version of raw_ref_op
(#64490).
The feature gate for the issue is #![feature(raw_ref_macros)]
.
About tracking issues
Tracking issues are used to record the overall progress of implementation.
They are also uses as hubs connecting to other relevant issues, e.g., bugs or open design questions.
A tracking issue is however not meant for large scale discussion, questions, or bug reports about a feature.
Instead, open a dedicated issue for the specific matter and add the relevant feature gate label.
Steps
- ImplementAdjust documentation (see instructions on rustc-dev-guide)Stabilization PR (see instructions on rustc-dev-guide)To pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item. Press space again to drop the item in its new position, or press escape to cancel.
Unresolved Questions
- Are we happy with the macro names? Currently:
core::ptr::raw_const!(path)
/core::ptr::raw_mut!(path)
Potentially blocked on docs issue:[fixed in Rustdoc: Fix macros 2.0 and built-in derives being shown at the wrong path #77862]pub macro
defined in submodule is shown at the wrong path #74355
Implementation history
thomcc and GrayJack
Metadata
Metadata
Assignees
Labels
A-raw-pointersArea: raw pointers, MaybeUninit, NonNullArea: raw pointers, MaybeUninit, NonNullB-unstableBlocker: Implemented in the nightly compiler and unstable.Blocker: Implemented in the nightly compiler and unstable.C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCCategory: An issue tracking the progress of sth. like the implementation of an RFCF-raw_ref_op`#![feature(raw_ref_op)]``#![feature(raw_ref_op)]`Libs-TrackedLibs issues that are tracked on the team's project board.Libs issues that are tracked on the team's project board.T-langRelevant to the language teamRelevant to the language teamT-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.Relevant to the library API team, which will review and decide on the PR/issue.disposition-mergeThis issue / PR is in PFCP or FCP with a disposition to merge it.This issue / PR is in PFCP or FCP with a disposition to merge it.finished-final-comment-periodThe final comment period is finished for this PR / Issue.The final comment period is finished for this PR / Issue.
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
jonas-schievink commentedon Jul 14, 2020
rustdoc displays the macro in
core::raw_mut
https://doc.rust-lang.org/nightly/core/macro.raw_mut.htmlRalfJung commentedon Jul 15, 2020
Sounds like a rustdoc bug, thanks for pointing that out.
Reported as #74355.
RalfJung commentedon Jul 27, 2020
Stabilization report
(Is there a template for these? I am entirely making this up.^^)
I'd like to propose stabilizing the
raw_ref_macros
feature. This feature guard two macros,core::ptr::raw_const!
andcore::ptr::raw_mut!
. Both of these macros take path expressions and their effect is to create a raw pointer as described in RFC 2582.This exposes a new primitive language ability: creating a raw pointer to something without going through an intermediate reference. This operation has been talked about in the Rust community for at least as long as I am around (I recall @arielb1 suggesting something like it). Example use cases that require such an operation are a general
offset_of!
macro, and creating pointers to unaligned fields of a packed struct. In particular, stabilizing this feature one way or another is crucial to unblock progress on one of the oldest open soundness bugs, #27060.The aforementioned RFC proposes a new primitive syntax for these macros. However, we are not yet ready to commit to a stable syntax for these operations -- but we still would like to expose this ability to stable code. Following precedent like the
try!
macro, we thus propose to stabilize this feature through macros first, which is what theraw_ref_macros
feature does.Existing users
The raw_ref operation (whether through the syntax or the macro) is already seeing some use in-tree, e.g. in #73845 and #73971. Out-of-tree, Gilnaa/memoffset#43 ports the popular
memoffset
crate to use this operation.An earlier crater experiment found around 50 crates that created references to unaligned fields of a packed struct. Some of those can probably be fixed by making copies instead of creating references (a common issue when using such fields in
println!
or comparison operations), but other likely truly need a pointer to that field, which currently cannot be created in a UB-free way.Implementation history
Potential blockers/issues
pub macro
defined in submodule is shown at the wrong path #74355: rustdoc currently does not renderpub macro
macros correctly.&raw [mut | const] $place
(raw_ref_op) #64490pub macro
defined in submodule is shown at the wrong path #74355nikomatsakis commentedon Jul 27, 2020
@RalfJung there is no template I'm aware of, I've been meaning to make one for some time
nikomatsakis commentedon Jul 27, 2020
@rfcbot fcp merge
Following @RalfJung's excellent report, I propose that we stabilize the
raw_const
andraw_mut
macros.40 remaining items
nikomatsakis commentedon Nov 5, 2020
Woohoo! I guess we need a stabilization PR now?
RalfJung commentedon Nov 5, 2020
🎉
However, if we stabilize while #74355 is unresolved, its docs will be rendered incorrectly.
RalfJung commentedon Dec 26, 2020
FWIW, I am still having doubt about the macro names, but no better names have been suggested yet either.
raw_const!
in particular sounds likeconst
is the subject here... usually this will probably be written asptr::raw_const!
, but that is still strange.const_raw!
might be better? At least nowconst
is unambiguously an adjective. That also works formut_raw!
. But usually,mut
is a suffix, not a prefix. @rust-lang/libs any ideas?RalfJung commentedon Jan 4, 2021
Another option might be
ptr::const_addr_of!
andptr::mut_addr_of!
. These at least indicate what the operation is doing.Rollup merge of rust-lang#80886 - RalfJung:stable-raw-ref-macros, r=m…
Rollup merge of #80886 - RalfJung:stable-raw-ref-macros, r=m-ou-se