<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-">