カバレッジ計測ツール (ここでは llvm-cov を使用) でジェネリクスを使用したコードを測定すると、単層化の影響で網羅率が上がらない事がある。

サンプル

以下では、単層化により Target<i32>Target<()> が生成されている。そして、それらはそれぞれ match の分岐の片側しか通らない。これにより網羅率が 100% にならない。


pub enum Target<R> {
    A(R),
    B(),
}

impl<R> Target<R> {
    pub fn method(self) {
        match self {
            Self::A(_) => {},
            Self::B() => {},
        }
    }
}

#[test]
fn test() {
    Target::A(1).method();
    Target::<()>::B().method();
}

対策

以下のように引数を与えると、単層化された各実体のパターンが必要な箇所について考慮されるようになる (このオプションがデフォルトで有効でないのは、結果の情報量が増えて見にくくなるためだろう)。


> cargo llvm-cov --show-instantiations --open