<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/127004>127004</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Misreported number of branches in conditional when ternary is introduced
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mitchgrout
</td>
</tr>
</table>
<pre>
With the following source file:
```c
/* test.c */
int ex1(int x, int y)
{
if (x || y) { return 1; }
return 0;
}
#define M(x) (x? 1 : 0)
int ex2(int x, int y)
{
if (x || M(y)) { return 1; }
return 0;
}
int main(void)
{
ex1(0, 0); ex1(0, 1); ex1(1, 0); ex1(1, 1);
ex2(0, 0); ex2(0, 1); ex2(1, 0); ex2(1, 1);
return 0;
}
```
Compile with `clang --coverage -o test test.c`, execute it, and generate the coverage report via `llvm-cov gcov test-test.gcda --branch-counts --branch-probabilities`; the resulting `test.c.gcov` file will contain:
```text
...
-: 1:/* test.c */
-: 2:
function ex1 called 4 returned 100% blocks executed 100%
4: 3:int ex1(int x, int y)
-: 4:{
4: 5: if (x || y) { return 1; }
branch 0 taken 2
branch 1 taken 2
branch 2 taken 1
branch 3 taken 1
1: 6: return 0;
4: 7:}
-: 8:
-: 9:#define M(x) (x? 1 : 0)
function ex2 called 4 returned 100% blocks executed 87%
4: 10:int ex2(int x, int y)
-: 11:{
4: 12: if (x || M(y)) { return 1; }
branch 0 taken 2
branch 1 taken 2
branch 2 taken 1
branch 3 taken 1
branch 4 taken 0
branch 5 taken 1
1: 13: return 0;
4: 14:}
-: 15:
...
```
`ex1` has 4 branches with 100% coverage, as expected. `ex2`, which should be equivalent to `ex1`, instead has 6 branches, with only 5/6 being taken. It's not clear why clang has opted to introduce a new branch, and it is similarly not clear how this branch would be executed.
---
System:
```text
Ubuntu clang version 19.1.7 (++20250114103238+cd708029e0b2-1~exp1~20250114103342.77)
Target: x86_64-pc-linux-gnu
Thread model: posix
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVk1v4zYQ_TX0ZSCBpCTLPvgQJzDQw57aoseCosYSuzTpipQ_Lvvbi6Fkx9kk2F2ggRFJI_LN47zHoVQIpnOIG1ZtWfWyUGPs_bA5mKj7bvBjXDS-vW7-MrGH2CPsvbX-bFwHwY-DRtgbi6x4Yjz9lnz6aXqQOyafIGKIuQYmUyANMy4CXgSTK7q7MPkMdHNlck0D6i3jTwBmD0yuLsDqZ1Y_p7fA6i0MGMfBgWDFFlj9ksbOMc6KbUJ4mfnIosW9cQhfCCoh0LXYgQBWPAGfUk6E5K8RIsg04td5EfhBGcfk6uRN-zbNVBlOJBK9YvsYEm9C4v0o8TBqxpPv8eR7PPkeT36A9-GSbrpPy3v2h6OxCGdyDbnBKtdBlml_wkF1CJlPtpi9QfPkM-AF9RgRTKQn5Vro0OGgIibn3ScPePRDhJNRhG3t6UDA0NE_AswSaqdbBVnWDMrpPtN-dDG8Ph8H36jGWBMNBspfbFOSAcNoI9mbLfnELidgtuTJ6XA21oL2LpJ672wf8RIZf8rzPFV--svIaABkjM_2xJuhcsLdj05H4x3JClpZiy2Uc_WxBcE5kxU01uuv4Va7W_gBsiTIghU_2HTfk6VpN0M-AAFAla4_vzmnigNwiOorOpAPMfFBTM4x8RorHkI3OmKms0zXt6b8nnKdFvPywTJXU63vz-uk0c81jQeB5M8LtKo_0AdA8LtEn7WhN9yF-EwgIT8S6MfN6n_Q6Y1Qt1g5x_hDrPpcUFH8WFBRvgo6KyeqSclp633Xj9iSk_OXHHoVoISJBoapQc1C3fpLaj4k2BF1xDaHNFvOTercG91D6P1oW2gQ8N_RnJRFFyF6uCeapAsRVZtyLu85Ewil9c5eoWJyt4QGqeOkkuTwW2SyDuB8BG1RDXDurzB1UELyR3JR9OSMwbejRlDg8DwnuLVOE8EECOZgrBrs9QGu92eIvQnzBDjflzJbNJ-KlmXZdPP7NUQ8fNrs_mxGF8eZ4QmHQFtCrHOR1-RAJrdMbiWXFReiFLyQBcV0W_MVl2vkjczEN7wcxbeHQUUp87qefP-HGjqMJPNltfx7WWZHnVnjxkvWuZHe9wOV-eBbtDTq6IO5PBJdtJuiXRdrtcCNqIt1KZbLar3oN5Wu6qZqStWqdr0WRbsqVYWFLBuuOcf9wmwSJykKXtDMvKnbWq10i1oJXi33rOR4UMbmdAzlfugWJoQRN0LWnJcLqxq0IX1bSUkipbdMSvrUGjbp7GrGLrCSWxNieIWJJlrcfDFhOu2wBTceGhzA71_taxwdRa2hLqQsnHt0EHFwariS-neHtItxsJs-xmO4nUG7zsR-bHLtD0zuKO18oaPxH9SRyV0iG5jczas5beR_AQAA__8bdty-">