<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/140427>140427</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [coverage] `return` in macros leads to incorrect coverage mapping after its invocation
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:codegen,
            coverage
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          whentojump
      </td>
    </tr>
</table>

<pre>
    
Compiler explorer [link](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxCAAzFykAA6oCoRODB7evnrJqY4CQSHhLFEx8baY9vkMQgRMxASZPn4JdpgO6bX1BIVhkdFxrXUNTdlD3b3FpYMAlLaoXsTI7BzmscHI3lgA1CaxbgoE%2BKgAdAh72CYaAIJX1wD099sQXDO7ZmbEmASLDOZm22C2xYTGQxFQdzWWBoIW2ADEAPII3YAVjcd22mMBVGeETeJjRGKxxK%2BP2If1iVhud2CBG2wFI22Qgj2VNuNwAbqg8OhtvxUBBadsmIyhXjdgB2NnE9CoSUWbaPZ5mN7BVI7QzvMx4Kj/Rn/ADuCDomH%2B22%2BphuxOJOueTBmROt1tJv1ZiqeEFi%2BI%2BLvJeq1wFQRDNFsd1qVwGsUcp7sBDCUDWCwGF20OTAImDYgm2CGimHNtDwLGC6cwCm2BFzwoiDBIINo2yiCCYHKcxDDxMRCNZHaxzIIUcsbqVe3RsQAItsDeCjNtC7C0BzokxgPmwyYJZOjSbnhoHZTIZvITchSDghAuTz8VKw/xiM8hXhdhPtho3U/R9suG%2BY3hBxYHStJ0%2BVQAUNEZPceyAzE7wfbMPxfH8FQQtxtjMDQkMBf9AOuYCQIFBJX33aUsVgwV4OfSdMJQ7ZYgw6jsN7GDQIgcCv2I28SDgukEKo99n1QyR6IYodLBwvD%2BReRlXig3CsUSYhaSoCB/n7Sj3hRdACTcP4PkZfsOOpI8bg4OZaE4FFeD8DgtFIVBOHRUSFQUBYljXMx4l4AhNFMuYAGsQBRcDzI4SQrJ8uzOF4BQQHA7ybNM0g4FgGBEBQVAWESE0yAoCA0Ey7KUAMIwAH0mAUBNqgUEqCGILwGD8vg6AzYgYogCIIoiEtiAAT04HhSC65heoRCJtHaeKBvyrMCARBhaD6hLSCwCIvGANwxFoGLuF4LAQSMcQlvwL4OiXbbbMwVR2i8DMItpSoIsLCJiHqHqPCwCLaqLfreCXYgIhSTBx0zQxgHnUAErmKgDGABQADU8EwA0EUSRgfpkQQRDEdgpAx%2BQlDUCLdASYrjH/fQ8AiGLIDmVBEiqzgAFoqAU1AaHoRm1VqxnVxCF6M22ZnF2XVdGZBRIsqMXhUD%2BxSsGpiA5jaDpnAgVxRhaUhAmCPoSgGBJcjSAQNZyFIjYYSZ%2BhiVpKgmzphkaTxmj0ZXqi6BpLb163bAdk3xg9nWpn1pXXOWCQzIs8KlvsjhtlUAAOAA2RnE8kJlSbtCroiqis6oat4IFwQguLWV4vJ8mY5lzJgsBiRXSACoL9E4MLSBYQYTjoujE9iJOuHQ2JpGs2yY%2Bi2LSHirQ5mStKFgIRIbvISh8qy%2BhiFCVgVgT5PU/T0HM8q9Jy1q%2Bq/JmXhMHwIg5b0fhMdEcRcbv/GVHUJbidIacmESH6I44SzSDD2lpwBEN0F50jZnHJOKc06bH3hAcqh8BDHzzmfZ4HgCpr3ePEc%2BE8K5V0wDXAY9cQqt3brEFEnce6Jw0GYeOGgUSSB7mYCUgCIqj1sOPSeiUZ4QCQEQTwS8EHEFhlFUg9RYbKEMJUIQCBUAGmslNDKq9ogbzYJwbeMC96zgQVnRMyDc6n1wZfYuN8EjPyxo/aQz9FCvyJnoFgAhQSoCLtfAAEuVCwmBGDXBuqgFGjBL7o0ccwNAriSABMUbwEJzjaj4CiT7eJYjDjxKkSEWgsj5EJIEbQAAkugEAtBaAchYIzRcJ8Gqfxej/Haf8AFAMihwIpJSyky2eHAowjMBALTeJo3eHTky6KQfGQx%2BdnjhPvKXRkGCVGTI8mXPBkM/5kLiLETusQNmbK2Zsth0dklcPwQ3QKwVOCxCjiPMR3DK7Nw4GYc5wCODlyWaQP6qRnCSCAA%3D%3D%3D)

Problematic input:

```c
// (1) "return" in macro
#define FOO \
    if (b) \
 return;

int g, cnt;

void foo(int a, int b) {
    do { // (2) inside an "if", "while" etc
        if (a)
            return; // (3) "return", "goto" etc
        // g++; // inserting a statement here eliminates the abnormal behavior
        FOO;
        cnt++; // <= wrong line coverage 
    } while (0);
}
```

Report:

```c
   10| 43.2k|void foo(int a, int b) {
   11|  43.2k|    do { // (2) inside an "if", "while" etc
   12|  43.2k|        if (a)
   13|  40.2k| return; // (3) "return", "goto" etc
   14|       |        // g++; // inserting a statement here eliminates the abnormal behavior
   15|  3.02k| FOO;
   16|  3.02k|        cnt++; // <= wrong line coverage 
   17| 3.02k|    } while (0);
   18|  43.2k|}
```

Line coverage for line 16 is "3.02k" but printing the value of `cnt` at the end of the program it instead says "10".

Real-world example: https://sources.debian.org/src/lzma/9.22-2.2/C/LzmaDec.c/#L628

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0V9uSqsqy_Rr6hVgdUKDgQz8UxV1RAbHFNy5lAQKFXAT9-hPYvebsufbeESdin9NBNJBZOUbWyETIqOtyUmP8wSwUZqG-RUOf0fZjzHDd02KomreYpo8PhoOIVk1e4pbFU1PSFrcss1DKvL4yC5UBctb3TccIkAE6A3RC05iW_TttycsgPBkB7sINyaCu3NKFiyYYjvtQcVCleKmygTrvogRGew1B5zkqvQMl6I5677jKA3pkte7dUIOPLo859wTRJCsKXFOlPkAYQLMZoXOHenjwe5vwqgUbiELoDuFwLVdneBjVdZFCQw96uBY7A_MjfGD4CKFpMWABFKhF4YQgfOqPK4RLiqi3UxUJ3-vWvoUicn0z2-jaJMdRuLpfHZd4zgT9874W7bQhu2V84hXrmF1TfWpPwfaQlqoQC3oTOrDcRPTUHSxJeVZdYlpCSSCPoikmVHuRrwlMYSYBFEbQsk_8qHKrVeee1J10rmKtgv5G3Z0rABCYwoPhTrqbPj8_FWp9AqhqcG9ZQgiPRZICUDnK0cDaAduFZ6ynaf1i2APrwufHbEgBUgww6hYALinAcTtsRxjfiLzL-vsUKEqUdpX1yE5FShSwrbUVon7wGUf786LaSsrRktzn3ZnEdcEA3asZoEN1QCqtzBcRAK9Tkw3Tzt4N-KBU3q7ne_vOn_Mb1vT85f8SfXO38Y0fdddTt3qX8rfjaHRB0kidoqJA_USjoQNud4BWpYakAsjIK3Pbq-PGQMtkRBVQ9OdIc1WxrC0Fjxyh0Fwnk6pOjoe2ZzOanpYVJF18O2LB61xo9Z2KUbHtkYQ45UmvE9lX4yO0z7vCj-uMmueDdb5bhyTzVZLB4fCUj-uRAfqUO3J2ytJs32dUCObNr7rBeO0jFDJlCk2_t7nX_dGFwVY77xP8gE9NGi-xs58upqy7bj_1haO6V0e5rOBuCJFr6Yp9EoQo6I5kPIq7i586tiudQzIui24rGaprkQTdgQVkXyXDVVvT1arm3Ye3tEKabpTxrr5oPeyVp5wIqAv8MIt8ihQG6LXkF0LmpRAdkr24v54v3W7XWHJMxN050kRdx6qskl63jsrO9AJfdwMlLIuTM4mlCLOt7gwhNDpX8RL1aYm-29ry8NzpouK6JpQe8dbhiKgTQ9EU9wg_NV_jHpAiyGkPaR1AxxqhyVUwULY3Emg3ZFib0VDlO1nCZ0hCSpBl0VzrcwgPnGhmPlouMkw9ZPdmhNfK_dE6CHpKFqnLbOOjEVl3A27HSafGZtDFDXR9J3HL-7gRd_kpjmNnPHogl1XH6hufWt0G2bl5M297NKJNdNtcWoxOIbEy_6BM3NOdiFkHUGurNVENqLhQDWRthJwW-B65NFfX9VQtJQ2cXkK7pRqgTQr9sC1MBugXV4a5sbHU6qho-e1JoE5vMOBhZFKv4o-3qT5OSF86AJxrHZyOqXFWPKu7Oacs-Krd5HdGk8NFEalNDclx8rIoyGCF9tQnhmInhQ_d7fmhW0UY-udXTJYfmzWpnk12jQ5TVXDn0y1fKs0m5pdCDNOrMJFV_dnUfHM67T6R-7Q6eV3euyLrywDCHYTAqzX5apd-3KOW5re8W9KoFy19dMmw-TyKd1uuwkX5tEmn5N7Jh4huVprobHwldMNDQYdCW-X2bjBdYDdGBx7hK7ccbHwzb91F5fdrnVieFd8tP5Nvj-_UdXQkR3JY7OdH6cCZjnxb2Q_-9nLfGKDb1SlzzNEii5i7ZE6qJV4S3xmgG0czsOM8taKk0nxzaYmi__RVFZTNqGhbTl9wxbk27d064ZaxKWQwuWWyoprPZ3U5iyZBTSvgvZa8qDR5vThyo3qC4Spxb70Qt5qu1Qle2iNnhHhnkMD3FakKUUCQdSv4brf3cR6cRRe5mnsYfVkzNT0r9YCsvDBea44dWC5SAmhUXblV17cVJfEztMcYO2i1fBL3WHvOQ02WNT-eL-GwlbVi_5goA_TIfa50dH_YNdUJzFyfok1_gVAbjmisFEM9KcON6EahbCTKJcm4hW3uQ8UJ4lGzn0VUiCg_SNgOC7WY1ldf-yRdsdBsS4tdCK8D0WCvRDDJQuvpJbZs3C4Tnn_LzegiQx06eTZaje0_rg-ATUjHwlHg5oBtKmDzcH0s1-7FcL-eg7Qusv19ffKuBjoaB0uuTnvl6jBAX1w3-UY7DJ27reI1OHd9xqXXMtmPruCux-MOTajI944nqGtpO4pGmCxGtFPLx2fk7pc3r0Y-gpABC0H9-W_FcJDh4L6lcYmrqM8TNq-boZ-_O14eZsl9Hcl88_oUYRkg8wxYsQwALe6HtmYAYPOaraKkpa9lQooveY1ZfbdjmQViOMiyLJtf5tD4Ffpl_A4XlC-yvO5ZwgDEJnX_y3inecpeKGWAPPuj2T9ffOFIyjd4Sucb9neKYPbndZenmI3qOdn8wsyvUzRfj1le4jlv3CffCL9TjL6EYX_8_cr0B4PwTxG-sQnt6b9Cf8cRBijz8Rsprzvc9nlN2Ijt-qjHFa57NsMtZnGZV3kd9bhj-wyzUVzTtopKNsZZdM9p-wNe3-2-JPvbMGv4TypGQIygsmNLa8KWc4USesdtRDD7HclIKvvSZt4gN-vwVQdJ_dkMX5XxcEPb_9AqLMvyHCMhVhTewZWR0P-ujDw_x_wK-j8pLA_-BfPflZoXvpZx38v-q4rz4m-mH5z_fz3AL140wjv3lf3PduCXf_r-mwbhpRnhJ9R_6Jh5rfyH8P-2hzZ_cFxo-8XKL9m8m5X9YgKAjYeebdq8fok0C3GPygGz9MLOHVf3zJJjo_7lwXU62-fLpqWkjSo272eJexylbBc9Xsg8xwDw_ncnR-VfI23LlMVTVDUlZgTI_jmBdXRoE9y9pzjOo_p7EOvahAF6-awiBuirdwD-Au-AATpigL55VpGKk_fka2DbLIHMcPAt_RDSlbCK3vAHL4nSAqxWovSWffCyxKXCKk1SeRUtsAyAJKQiAItLKl34RHzLPwAHFtyClzluseKk93TBcWIcLS-xIIkSXjIih6soL9_L8l7NCb7lXTfgD17kRCC9lVGMy-41lwKQlFFNGAEmNMUEf7fybP8uxWxYqG_tx4z1VzyQjhG5Mu_67jd6n_fla879FbRQ52p8Px1L7tdLoWNLHKUd21M2rxPatjjpf1e9iprm1fqXHrds3ndsXt9pEvU5rd-Gtvz4xyic99kQvye0mqUv73-f_mpaWuCkZ4D-2nfHAP176_cP8D8BAAD__-iDvVs">