<div dir="ltr"><div>Hi all,<br></div><div><br></div><div>I have faced unexpected coverage results for inline function with conditional #ifdef</div><div><br></div><div>// -- header.h<br></div><div>#pragma once<br><br>inline int bar(int x) {<br>    int y = 10;<br>#ifdef IE<br>    if (x)<br>        y *= 2;<br>#else<br>    y -= 5;<br>#endif<br>    return x * y;<br>}</div><div><br></div><div>// -- lib1.cpp</div><div>#include "header.h"<br><br>int lib1_foo(int x) {<br>    return bar(x) + x;<br>}<br></div><div><br></div><div>// -- main.cpp</div><div>#include <iostream><br>#include "header.h"<br><br>extern int lib1_foo(int);<br><br>int main_foo(int x) {<br>    return bar(x) + x;<br>}<br><br>int main(int c, char**) {<br>    std::cout << lib1_foo(c) << " " << main_foo(c) << std::endl;<br>    return 0;<br>}</div><div><br></div><div>clang++ -fprofile-instr-generate -fcoverage-mapping -O2 -c -g lib1.cpp -o lib1.o <b>-DIE</b><br>clang++ -fprofile-instr-generate -fcoverage-mapping -O2 -c -g main.cpp -o main.o<br>clang++ -fprofile-instr-generate -fcoverage-mapping -O2 -g main.o lib1.o -o bin<br>./bin<br>llvm-profdata merge -o merged.prof default.profraw<br>llvm-cov export -instr-profile merged.prof -object bin<br></div><div><br></div><div>Output of the program will be "21 6"</div><div>However, segments for header.h will be:</div><div>[3,23,2,1,1],[5,2,0,0,1],[8,2,2,1,0],[12,2,0,0,0] ("y -= 5;" was performed twice)<br></div><div>Looks like coverage wasn't able to connect source code with counters properly.<br></div><div><br></div>-Sam<br></div>