Skip to content

inline-const is not an expr in macros, but it should be #84155

Closed
@lf-

Description

@lf-
Contributor

While writing a macro thingy that generates match blocks, I had a problem where it was previously using an expr type, but that didn't work[1], as it didn't accept the inline const as an expr, so I tried putting it as a pat instead, but that didn't work[2] as pats aren't accepted in exprs, even if they would be valid in text form.

[1] The subject of this bug report:

macro_rules! doggo {
    ($v:expr) => {4};
}

fn main() {
    doggo!(const { 2 });
}

Compile failure (the subject of this bug):

error: no rules expected the token `const`
 --> src/main.rs:8:12
  |
1 | macro_rules! doggo {
  | ------------------ when calling this macro
...
8 |     doggo!(const { 2 });
  |            ^^^^^ no rules expected this token in macro call

error: aborting due to previous error

error: could not compile `rusttest`

[2] The thing I tried, that I think is probably reasonable behaviour, although the error needs improvement:

#![feature(inline_const)]

macro_rules! doggo {
    ($v:pat) => {
        $v
    };
}

fn main() {
    let v = doggo!(const { 2 });
}

Error:

error: expected expression, found `const{ 2 }`
  --> src/main.rs:5:9
   |
5  |         $v
   |         ^^ expected expression
...
10 |     let v = doggo!(const { 2 });
   |             ------------------- in this macro invocation
   |
   = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

Meta

rustc --version --verbose:

rustc 1.53.0-nightly (d0695c908 2021-04-12)
binary: rustc
commit-hash: d0695c9081b16077d0aed368bccaf437d77ff497
commit-date: 2021-04-12
host: x86_64-unknown-linux-gnu
release: 1.53.0-nightly
LLVM version: 12.0.0

Activity

eddyb

eddyb commented on Apr 13, 2021

@eddyb
Member

Is it possible there's some check for the first keyword of a $...:expr and const should've been added to that list?

Sadly I'm not sure where that would be. I think I've seen a few different things like that but most of them for advanced diagnostics or that "FOLLOW sets" check on macro definitions (whereas this is happening during expansion).

cc @petrochenkov

added
A-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)
F-inline_constInline constants (aka: const blocks, const expressions, anonymous constants)
on Apr 13, 2021
petrochenkov

petrochenkov commented on Apr 13, 2021

@petrochenkov
Contributor

This was introduced in #80135 to fix a regression.

lf-

lf- commented on Apr 13, 2021

@lf-
ContributorAuthor

This was introduced in #80135 to fix a regression.

Reading through that, and, oh no. Can we have a different expr type in macros that supports const or something? It seems like it's not possible to avoid this side of the bug because you can't wrap a pattern in {} or turn it into an expr.

dtolnay

dtolnay commented on Feb 20, 2023

@dtolnay
Member

Closing in favor of #86730.

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-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)F-inline_constInline constants (aka: const blocks, const expressions, anonymous constants)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @eddyb@jonas-schievink@dtolnay@petrochenkov@lf-

      Issue actions

        inline-const is not an expr in macros, but it should be · Issue #84155 · rust-lang/rust