Inline const expressions have been stabilised
Inline const expressions have been stabilised

Stabilise inline_const by nbdd0121 · Pull Request #104087 · rust-lang/rust

Inline const expressions have been stabilised
Stabilise inline_const by nbdd0121 · Pull Request #104087 · rust-lang/rust
This is a nice small feature. I'm curious about the commit description:
rust
foo(const { 1 + 1 })
which is roughly desugared into
rust
struct Foo; impl Foo { const FOO: i32 = 1 + 1; } foo(Foo::FOO)
I would have expected it to desugar to something like:
rust
foo({ const TMP: i32 = 1 + 1; TMP })
But I can't seem an explanation why the struct with impl
is used. I wonder if it has something to do with propagating generics.
It's because it has to work in pattern contexts as well, which are not expressions.
Wait, in pattern context? How? Can you give an example?
rust
fn foo(x: i32) { match x { const { 3.pow(3) } => println!("three cubed"), _ => {} } }
But it looks like inline_const_pat
is still unstable, only inline_const
in expression position is now stabilized.
They tested the same strings on that implementation
The code they were looking at was used for writing the table, but they were testing the one that read it (which is instead correct).
though judging by the recent comments someone’s found something.
Yeah that's me :)The translation using an associated const also works when the const
block uses generic parameters. For example:
fn require_zst<T>() { const { assert!(std::mem::size_of::<T>() == 0) } }
This can be written as:
fn require_zst<T>() { struct Foo<T>(PhantomData<T>); impl<T> Foo<T> { const FOO: () = assert!(std::mem::size_of::<T>() == 0); } Foo::<T>::FOO }
However it cannot be written as:
fn require_zst<T>() { const FOO: () = assert!(std::mem::size_of::<T>() == 0); FOO }
Because const FOO: ()
is an item, thus it is only lexically scoped (i.e. visible) inside require_zst
, but does not inherit its generics (thus it cannot use T
).