Skip to content

as cast of non-Copy enum is no longer a move #102389

Description

@scottmcm

@MinusKelvin noticed this 1.63→1.64 change in #102303 (comment)

I tried this code:

pub enum Enum { A, B, C }
pub fn func(inbounds: &Enum, array: &[i16; 3]) -> i16 {
    array[*inbounds as usize]
}

I expected to see this happen: because Enum is non-Copy, an error about moving out from behind a reference, like happened in 1.63 https://rust.godbolt.org/z/vGPqbsE6v

error[E0507]: cannot move out of `*inbounds` which is behind a shared reference
 --> <source>:3:11
  |
3 |     array[*inbounds as usize]
  |           ^^^^^^^^^ move occurs because `*inbounds` has type `Enum`, which does not implement the `Copy` trait

Instead, this happened: it compiles fine in 1.64 https://rust.godbolt.org/z/svsPMxTs8 and in nightly https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=817f19e95903785423743c2a8466c189


This is probably cased by

Change enum->int casts to not go through MIR casts #96862

which is mentioned in https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1640-2022-09-22

It's unclear to me whether this is intentional under the banner of "Drop behaviour", since there's no Drop trait involved.

Activity

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

Metadata

Metadata

Assignees

Labels

C-bugCategory: This is a bug.P-criticalCritical priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-langRelevant to the language teamregression-from-stable-to-stablePerformance or correctness regression from one stable version to another.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions