rust-lang / rust-lang/rust-clippy
missing-const-for-fn might want to skip macros
Open
Nobody has claimed this yet.
C-bug
I-false-positive
I-suggestion-causes-error
L-nursery
- Dominant language
- Rust
- Stars
- 13.5k
- Forks
- 2.2k
- Avg merge
- 2d 10h
- Merged PRs (30d)
- 32
Description
Summary
.
Reproducer
I tried this code:
#![recursion_limit = "10"]
macro_rules! link {
($outer:ident, $inner:ident) => {
struct $outer($inner);
impl $outer {
fn new() -> $outer {
$outer($inner::new())
}
}
impl std::ops::Deref for $outer {
type Target = $inner;
fn deref(&self) -> &$inner {
&self.0
}
}
};
}
struct Bottom;
impl Bottom {
const fn new() -> Bottom {
Bottom
}
}
link!(A, B);
link!(B, C);
link!(C, D);
link!(D, E);
link!(E, F);
link!(F, G);
link!(G, H);
link!(H, I);
link!(I, J);
link!(J, K);
link!(K, Bottom);
clippy sugttests touching the macro :s
warning: this could be a `const fn`
--> a.rs:6:13
|
6 | / fn new() -> $outer {
7 | | $outer($inner::new())
8 | | }
| |_____________^
...
38 | link!(K, Bottom);
| ---------------- in this macro invocation
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#missing_const_for_fn
= note: requested on the command line with `-W clippy::missing-const-for-fn`
= note: this warning originates in the macro `link` (in Nightly builds, run with -Z macro-backtrace for more info)
help: make the function `const`
|
6 | const fn new() -> $outer {
| +++++
the resulting code causes overflows:
error[E0275]: overflow evaluating the requirement `J: std::marker::Freeze`
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]` attribute to your crate (`a`)
note: required because it appears within the type `I`
--> a.rs:36:7
|
36 | link!(I, J);
| ^
note: required because it appears within the type `H`
--> a.rs:35:7
|
35 | link!(H, I);
| ^
note: required because it appears within the type `G`
--> a.rs:34:7
|
34 | link!(G, H);
| ^
note: required because it appears within the type `F`
--> a.rs:33:7
|
33 | link!(F, G);
| ^
note: required because it appears within the type `E`
--> a.rs:32:7
|
32 | link!(E, F);
| ^
note: required because it appears within the type `D`
--> a.rs:31:7
|
31 | link!(D, E);
| ^
note: required because it appears within the type `C`
--> a.rs:30:7
|
30 | link!(C, D);
| ^
note: required because it appears within the type `B`
--> a.rs:29:7
|
29 | link!(B, C);
| ^
note: required because it appears within the type `A`
--> a.rs:28:7
|
28 | link!(A, B);
| ^
error[E0275]: overflow evaluating the requirement `K: std::marker::Freeze`
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]` attribute to your crate (`a`)
note: required because it appears within the type `J`
--> a.rs:37:7
|
37 | link!(J, K);
| ^
note: required because it appears within the type `I`
--> a.rs:36:7
|
36 | link!(I, J);
| ^
note: required because it appears within the type `H`
--> a.rs:35:7
|
35 | link!(H, I);
| ^
note: required because it appears within the type `G`
--> a.rs:34:7
|
34 | link!(G, H);
| ^
note: required because it appears within the type `F`
--> a.rs:33:7
|
33 | link!(F, G);
| ^
note: required because it appears within the type `E`
--> a.rs:32:7
|
32 | link!(E, F);
| ^
note: required because it appears within the type `D`
--> a.rs:31:7
|
31 | link!(D, E);
| ^
note: required because it appears within the type `C`
--> a.rs:30:7
|
30 | link!(C, D);
| ^
note: required because it appears within the type `B`
--> a.rs:29:7
|
29 | link!(B, C);
| ^
error: aborting due to 2 previous errors
Version
rustc 1.81.0-nightly (9c3bc805d 2024-06-27)
binary: rustc
commit-hash: 9c3bc805dd9cb84019c124b9a50fdff1e62a7ec9
commit-date: 2024-06-27
host: x86_64-unknown-linux-gnu
release: 1.81.0-nightly
LLVM version: 18.1.7
Additional Labels
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
No source file or test is named. Start by locating the missing_const_for_fn lint implementation and its existing tests, then reproduce the link! macro example; done means macro-generated functions no longer receive the problematic suggestion while ordinary cases remain covered.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100