Why is rust complaining about an unused function when it is only used from tests?
Asked Answered
T

1

6

When a function is only called from tests rust complains that it is never used. Why does this happen and how to fix this?

Example:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=52d8368dc5f30cf6e16184fcbdc372dc

fn greet() {
    println!("Hello!")
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_greet() {
        greet();
    }
}

I get the following compiler warning:

   Compiling playground v0.0.1 (/playground)
warning: function is never used: `greet`
 --> src/lib.rs:1:4
  |
1 | fn greet() {
  |    ^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: 1 warning emitted
Theatre answered 18/8, 2021 at 16:40 Comment(4)
Relevant: How to suppress “function is never used” warning for a function used by tests?Chemistry
Does this answer your question? How to suppress "function is never used" warning for a function used by tests?Allerus
@Allerus In my case the correct solution was to mark the function as pub. See my answerTheatre
Same as this answer in the duplicate, then.Allerus
T
10

In rust fn is private by default. greet() is not accessible outside your module. If greet() is not used inside it except in tests, then rust is correctly flagging it as dead code.

If greet() is supposed to be part of your public interface mark it as pub:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8a8c50b97fe3f1eb72a01a6252e9bfe6

pub fn greet() {
    println!("Hello!")
}

If greet() is a helper intended to be only used in tests move it inside mod tests:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3dc51a36b4d5403ca655dec0210e4098

#[cfg(test)]
mod tests {
    fn greet() {
        println!("Hello!")
    }
    
    #[test]
    fn test_greet() {
        greet();
    }
}
Theatre answered 18/8, 2021 at 16:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.