Closed
Description
const LEN: usize = 4;
#[derive(Debug)]
struct Wrapper([u8; LEN]);
fn main() {
println!("{:?}", Wrapper([0, 1, 2, 3]));
}
warning: constant item is never used: `LEN`
--> src/main.rs:1:1
|
1 | const LEN: usize = 4;
| ^^^^^^^^^^^^^^^^^^^^^
If the struct is a record struct with a named field, the false positive doesn't trigger.
Activity
oli-obk commentedon Dec 18, 2018
I have not been able to get anywhere with this issue.
I did some experiments in https://github.com/rust-lang/rust/blob/master/src/librustc/middle/dead.rs and I believe the issue is that using a tuple struct's constructor will only mark the constructor as used (which has a different DefId and NodeId than the tuple struct item). This guess has a further datapoint than my reading: Adding
let x: Wrapper;
will silence the dead code warning aboutLEN
.The reason that we are not getting a dead code warning about
Wrapper
is that checking the item for "having been used" will also accept just the constructor having been used:rust/src/librustc/middle/dead.rs
Lines 467 to 468 in 041254b
I have not been able to figure out a way to go from a constructor back to its item, there only seems to be code for the other way around.
We might be able to hack it by getting the function signature of the item and checking the return type, but in order to do that, we'd need to know for sure that it's a tuple struct constructor.
Alternatively we can just build up a map from constructors to items by filling it in whenever we encounter a tuple struct item.
ok enough rubber-ducking. I'm gonna try the sentence above now.
Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov
Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov
Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov
Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov
Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov