Open def- opened 5 years ago
My way of considering this is that these are lines of code that could be executed, but they are not. So if your target is to know how many percent code coverage your software has, this behavior distorts it.
I'm guessing this is probably by design - member function templates that aren't called aren't instantiated & might not be valid instantiations (consider something like std::list
Extended Description
$ cat x.cpp template
struct C
{
C(T x)
: v(x)
{
}
};
int main() { C c(5);
}
$ clang++ -fprofile-instr-generate -fcoverage-mapping x.cpp -o x $ ./x $ llvm-profdata merge -sparse default.profraw -o default.profdata $ llvm-cov show ./x -instr-profile=default.profdata 1| |template
2| |struct C
3| |{
4| | C(T x)
5| | : v(x)
6| 1| {
7| 1| }
8| |
9| | void foo(T x)
10| | {
11| | v = x;
12| | }
13| |
14| | T v;
15| |};
16| |
17| |int main()
18| 1|{
19| 1| C c(5);
20| 1|}
I would expect foo to be considered uncovered, but since the method is inside of a template class it is apparently not generated when it's also not used. If the class is non-templated foo is shown correctly as being uncovered.