- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.9k
Closed
Closed
Copy link
Labels
C-bugCategory: This is a bug.Category: This is a bug.
Description
#[derive_const] derives do not introduce ~const bounds on generic parameters, preventing them from being used on most types with them.
I tried this code:
#![feature(const_trait_impl)]
#![feature(derive_const)]
#[derive_const(Clone)]
pub struct X<T>(T);I expected to see this happen: The code should compile, with the trait implementation looking like impl<T> const Clone for X<T> where T: ~const Clone.
Instead, this happened: I get the following compilation errors:
error[[E0277]](https://doc.rust-lang.org/nightly/error-index.html#E0277): the trait bound `T: ~const Clone` is not satisfied
 --> src/lib.rs:5:17
  |
4 | #[derive_const(Clone)]
  |                ----- in this derive macro expansion
5 | pub struct X<T>(T);
  |                 ^ the trait `~const Clone` is not implemented for `T`
  |
note: the trait `Clone` is implemented for `T`, but that implementation is not `const`
 --> src/lib.rs:5:17
  |
4 | #[derive_const(Clone)]
  |                ----- in this derive macro expansion
5 | pub struct X<T>(T);
  |                 ^
  = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider restricting type parameter `T`
  |
5 | pub struct X<T: ~const std::clone::Clone>(T);
  |               ++++++++++++++++++++++++++
error[[E0277]](https://doc.rust-lang.org/nightly/error-index.html#E0277): the trait bound `T: ~const Clone` is not satisfied
 --> src/lib.rs:5:17
  |
4 | #[derive_const(Clone)]
  |                ----- in this derive macro expansion
5 | pub struct X<T>(T);
  |                 ^ the trait `~const Clone` is not implemented for `T`
  |
note: the trait `Clone` is implemented for `T`, but that implementation is not `const`
 --> src/lib.rs:5:17
  |
4 | #[derive_const(Clone)]
  |                ----- in this derive macro expansion
5 | pub struct X<T>(T);
  |                 ^
  = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
error[[E0015]](https://doc.rust-lang.org/nightly/error-index.html#E0015): cannot call non-const fn `<T as Clone>::clone` in constant functions
 --> src/lib.rs:5:17
  |
4 | #[derive_const(Clone)]
  |                ----- in this derive macro expansion
5 | pub struct X<T>(T);
  |                 ^
  |
  = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
  = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
Some errors have detailed explanations: E0015, E0277.
For more information about an error, try `rustc --explain E0015`.
error: could not compile `playground` due to 3 previous errors
Using #[derive_const(PartialEq)] and #[derive_const(Default)] also causes compilation errors.
Meta
rustc --version --verbose:
rustc 1.69.0-nightly (d7948c843 2023-01-26)
binary: rustc
commit-hash: d7948c843de94245c794e8c63dd4301a78bb5ba3
commit-date: 2023-01-26
host: x86_64-unknown-linux-gnu
release: 1.69.0-nightly
LLVM version: 15.0.7
I could also reproduce this issue on the playground (1.69.0-nightly (2023-02-03 658fad6)).
Metadata
Metadata
Assignees
Labels
C-bugCategory: This is a bug.Category: This is a bug.