Skip to content

Tracking Issue for using std::mem::transmute() in const fn (const_fn_transmute) #53605

Closed

Description

@TheDarkula

Using std::mem::transmute() in constant functions is behind the const_transmute/const_fn_transmute feature gate.
(In constants, it is stable.)

Blocked on rust-lang/const-eval#14.

Activity

  1. added a commit that references this issue on Aug 30, 2018
  2. mjbshaw commented on Oct 2, 2018

    @mjbshaw
    Contributor

    I, for one, would love this, because I've had to use the union transmute hack more times than I feel comfortable. std::mem::transmute is still (super) unsafe, but at least it makes sure the types have the same size.

  3. TheDarkula commented on Oct 2, 2018

    @TheDarkula
    Author

    @mjbshaw It's already been merged :)

  4. mjbshaw commented on Oct 2, 2018

    @mjbshaw
    Contributor

    @TheDarkula I know. I'm just trying to show support for eventually stabilizing this feature (rather than being removed because people are opposed to it).

  5. jamesmunns commented on Oct 19, 2018

    @jamesmunns
    Contributor

    Even with the flag, is this possible? I am getting an error stating that the use of unsafe functions are not allowed in const fn:

    pub const unsafe fn rx_buffer_init() -> [BufferDescriptor; BUFFER_CT] {
        transmute::<
            [u8; size_of::<BufferDescriptor>() * BUFFER_CT],
            [BufferDescriptor; BUFFER_CT]
        >([0u8; size_of::<BufferDescriptor>() * BUFFER_CT])
    }

    gives me

    error: call to unsafe function is unsafe and unsafe operations are not allowed in const fn
      --> foo/src/test.rs:18:5
       |
    18 | /     transmute::<
    19 | |         [u8; size_of::<BufferDescriptor>() * BUFFER_CT],
    20 | |         [BufferDescriptor; BUFFER_CT]
    21 | |     >([0u8; size_of::<BufferDescriptor>() * BUFFER_CT])
       | |____________________________________________________________^ call to unsafe function
       |
       = note: consult the function's documentation for information on how to avoid undefined behavior
    
  6. mgostIH commented on Mar 2, 2019

    @mgostIH

    Is there some blocker on this or could this be starting to get stabilized? I'm mostly looking out for a way to define a function from a u8 array without any indirection but I have no idea whether this is supposed to be supported or not in the design of const fn.

  7. MSxDOS commented on Jun 22, 2019

    @MSxDOS

    unsafe in const fn has been stabilized in 1.33. Is there anything else left preventing this from being stabilized as well?

    EDIT: Ugh, in fact, there is. For example, usize -> function pointer throws

    error[E0080]: it is undefined behavior to use this value
    ...
    type validation failed: encountered 10220800, but expected a pointer
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior

    ... which makes const_transmute pretty much useless for me.

  8. added
    T-langRelevant to the language team
    T-libs-api[DEPRECATED; DO NOT USE]
    C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFC
    A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)
    B-unstableBlocker: Implemented in the nightly compiler and unstable.
    requires-nightlyThis issue requires a nightly compiler in some way. When possible, use a F-* label instead.
    on Aug 29, 2019
  9. RalfJung commented on Aug 29, 2019

    @RalfJung
    Member

    Given that union field access is already possible inside const (but not inside const fn), it seems somewhat silly to block transmute. All that does is make code less readable by pushing people to use unions instead of transmutes.

    So I propose we stabilize transmute in const, but not const fn. However, currently our handling of intrinsics in const-qualif is somewhat broken, so that should be fixed first.

  10. 11 remaining items

  11. added
    I-libs-radarLibs issues that are tracked on the team's radar.
    on Jul 29, 2020
  12. changed the title [-]Tracking Issue For Using std::mem::transmute() In Constants[/-] [+]Tracking Issue for using std::mem::transmute() in const fn[/+] on Aug 7, 2020
  13. changed the title [-]Tracking Issue for using std::mem::transmute() in const fn[/-] [+]Tracking Issue for using std::mem::transmute() in const fn (const_fn_transmute)[/+] on Aug 7, 2020
  14. Ekleog commented on Dec 18, 2020

    @Ekleog

    Is there any summary of what the current status is here to actually get transmute to be const in const fn?

    (Coming here because I'd have liked to make Path::new() const, but AFAIU this requires either pointer deref or transmute to be const, and transmute sounds easier to stabilize than pointer deref)

  15. RalfJung commented on Dec 19, 2020

    @RalfJung
    Member

    Raw pointers and transmute are pretty much equal in terms of "what it takes to make them const-stable".

    The next step is to figure out what we want to do with UB during CTFE, for which I recently proposed an RFC: rust-lang/rfcs#3016. The key PR needed to implement that RFC is up at #78407.

  16. programmerjake commented on Apr 2, 2021

    @programmerjake
    Member

    I think it would be a good idea to split out into a separate feature that can be stabilized transmute of references to types that are repr(transparent) wrappers:

    #[repr(transparent)]
    pub struct MySlice(pub [u8]);
    
    impl MySlice {
        pub const fn new(v: &[u8]) -> &MySlice {
            unsafe { std::mem::transmute(v) }
        }
    }
  17. RalfJung commented on Apr 2, 2021

    @RalfJung
    Member

    I think once we find some kind of consensus on rust-lang/rfcs#3016 (which turned out to be much harder than I anticipated), there's not much blocking stabilization here.

  18. benesch commented on Jun 18, 2021

    @benesch
    Contributor

    So, rust-lang/rfcs#3016 was merged. @RalfJung, does that mean we can proceed with stabilization here?

  19. benesch commented on Jun 18, 2021

    @benesch
    Contributor

    It seems to me that the answer is probably yes, since #75196 has a stabilization PR out and was previously blocked on rust-lang/const-eval#14.

  20. RalfJung commented on Jun 18, 2021

    @RalfJung
    Member

    The stabilization PR is already up. :)
    #85769

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)B-unstableBlocker: Implemented in the nightly compiler and unstable.C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCI-libs-radarLibs issues that are tracked on the team's radar.T-langRelevant to the language teamT-libs-api[DEPRECATED; DO NOT USE]requires-nightlyThis issue requires a nightly compiler in some way. When possible, use a F-* label instead.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions