rustwarningsdead-code

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


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

Solution

  • 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();
        }
    }