Skip to content

dead_code false positive for const used in definition of tuple struct #56281

Closed
@crumblingstatue

Description

@crumblingstatue
Contributor
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

added
A-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.
C-bugCategory: This is a bug.
on Nov 27, 2018
self-assigned this
on Nov 29, 2018
oli-obk

oli-obk commented on Dec 18, 2018

@oli-obk
Contributor

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 about LEN.

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:

let ctor_id = get_struct_ctor_id(item);
should_warn && !self.symbol_is_live(item.id, ctor_id)

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.

added a commit that references this issue on Dec 21, 2018

Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov

3a2d846
added 5 commits that reference this issue on Dec 22, 2018

Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov

4481656

Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov

29f2fee

Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov

99f4ce2

Rollup merge of rust-lang#56953 - oli-obk:dead_const, r=petrochenkov

5157c22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.C-bugCategory: This is a bug.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    Participants

    @oli-obk@Centril@crumblingstatue

    Issue actions

      dead_code false positive for const used in definition of tuple struct · Issue #56281 · rust-lang/rust