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

    <tr>
        <th>Summary</th>
        <td>
            [LLVM-COV] Macro statements cause incorrect coverage for switch-case statements
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          8ss-boop
      </td>
    </tr>
</table>

<pre>
    llvm version:
clang version 21.0.0git (https://github.com/llvm/llvm-project.git 872eac7af0050813062baba9662beb81093b6b55)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /root/software/llvm-releases/llvm-0704/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64

```c
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define SW(n, c) case n: return (int)(c)
int get_value(char ch)
{
    if (isalnum(ch))
        switch (ch) {
            SW('0', -1);
            SW('1', 2);
            SW('2', 3);
            SW('3', 5);
            SW('4', 7);
            SW('5', 11);
            SW('6', 13);
            SW('7', 17);
            SW('8', 19);
            SW('9', 23);
            SW('a', 29);
            SW('A', 29);
        }
    return -1;
}
int main(void)
{
    char input = '7';
    int result = get_value(input);
    printf("Value for '%c': %d\n", input, result);
    return EXIT_SUCCESS;
}
```
for the program above, we got the following coverage report from llvm-cov 

```
/*
clang -std=c2x -lm -fcoverage-mapping -fprofile-instr-generate test.c
./a.out
llvm-profdata merge default.profraw  -o default.profdata;
llvm-cov show --show-line-counts -instr-profile=default.profdata ./a.out > test.c.lcov
*/

    1|       |#include <stdio.h>
    2|       |#include <ctype.h>
    3|       |#include <stdlib.h>
    4|      1|#define SW(n, c) case n: return (int)(c)
    5|       |int get_value(char ch)
    6|      1|{
    7|      1|    if (isalnum(ch))
    8|      1|        switch (ch) {
    9|      0|            SW('0', -1);
   10|      0|            SW('1', 2);
   11|      0|            SW('2', 3);
   12|      0|            SW('3', 5);
   13|      0|            SW('4', 7);
   14|      0|            SW('5', 11);
   15|      0|            SW('6', 13);
   16|      1|            SW('7', 17);
   17|      0|            SW('8', 19);
   18|      0|            SW('9', 23);
   19|      0|            SW('a', 29);
   20|      1|            SW('A', 29);
   21|      1|        }
   22|      0|    return -1;
   23|      1|}
   24|       |int main(void)
   25|      1|{
   26|      1|    char input = '7';
   27|      1|    int result = get_value(input);
   28|      1|    printf("Value for '%c': %d\n", input, result);
   29|       |    return EXIT_SUCCESS;
   30|      1|}



```

the output is:
```
Value for '7': 17
```
Obviously, only  line16, which corresponding to input ‘7’, was executed. Line 20 was wrongly marked as executed.

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysV1GPmzgQ_jXOywhkGwjwkIc02ZwqterD9nr3VhkwxFdjR7ZJdv_9yQSyyYYS9a4REov9zczn8Xi-NbNWNIrzFUo-oGS7YJ3ba7PKrA0KrQ-LQlevKymPLRy5sUIrFK0RXpeSqWYcAkpCHOJGOEA02zt3sB5Fd4juGuH2XRGWukV05_0Mr-Bg9D-8dKG3ylLKWZmyGuMEZyTCS1qwguXLJS14kRGcR8WySBJEc4TXX5lpuEPRGl6y5fdlHHTqh9InFUihupegUZ0H7Q1nFbS64tJDD9qKF4TXH5V1TEpebYXx44jujNYO0Z3VtTsxw0eChkvOLLfjN05xjOiuEArh9U53qoKSqUpUzHH4Y7MBcXbN3DlL3nVnjTcXhc9EWSK6Gyi_UaU7Qn63Q4rw-plLXjpe_X9PmwuptpNOeJNoDSGKPqAYt8v4OthPEf5Z4vNT-g8aCVXKruKAoo11ldDhHkVPd1Olez3w6SnrKimKq7mK10JxeP4L0UwhuoES0RxKZjn0yzbcdUb5IhXK-WKiWXmuKaEcNNx9PzLZcT-8ZwbK_XkSpR8QXgMAiLo3tkyqru1hvZd8mPY_exKu3MM4CW_G46-nh2iKEU09yYB4D9HPYGSA0VkUHVDRLCoaUMksKh5Q6SwqGVBknv5yhM0zS0fYfNBshOWzsHzM2XxQNsLmva1_DkPpdvgaaisgZ8B5wpdVy4RCNDtqUb0vp77KhDp0DlC0hTENlwje3HDbyfP8dYH2Vjd0DkYoV_eM6TePglob6KknZe_Wn_ukQslGIUr9ggYnmyHIjbthPU9_f_z6_fnPzebp-fl6ZZfDjPDax3F7DgejG8NaYIU-cu_2xKHRrp-rtZT6JFQDpT5ywxoOhh-0cVAb3ULfYUt9hHetoj_XO0TfNCewrkLRtqQvEMgWgnr0F7TscPABgvpgdC0kD3zbM0HDFTe-fTluXeibT4jojoW6cwivRzGqK-YYtNw0HCpes0660A8bdgII9M2Yh56TceFt9_oEQeBfvoPyoNSdchYGDgMjFG3f-4ELGUDR08AxlKU-9mvvl9_nxG8KQenmUnmbmR7qEXQGfNNVPSKa93zVZz0kvqDJGf3fO693ktwEn-3FHrO8jX45TunNODzu19mdAcx28PyCwld4eNjTCX5oONnlCXloN9n3CX1oN6kEJHpoN6kNJH5oN60WJHloOK0fZDm5dfBQUUj6MOK0xpDsoeG06pDHVTOtQxQ_XOO0MlEyaXjRKnpfHu_Uy4Oid6dsNI7vDuudwnlYMn1I6f3GPVBBOnGsf0EX6f0h_71KSfObhMCcdvpGiyfy-vZcCx9ee-XUnfOpEfZ887pG3JBPB-YkfYf6UhyF7qx89fy1kq8AXqHIspfovSj3UGpjuD1oVXkBdXrcjieKMozyLB3_ynsbZoG_8LJzvArhk2_8FPejJ6NVI1-hZeYHr-Aah_B6Ua2iKo9ytuArkiYRzqIcZ4v9apmXRcaqKC0KmsaExxXLCatzzpKIRglbiBXFNMEpJTiNE5yFhFc0Y3lN4zqjjGcoxrxlQoZekENtmoWwtuMrEudpSheSFVza_o5LqeIn6Gf93ibbhenvt0HRNRbFWArr7JsbJ5zsL8efPn37HGy-fEPJFj6z0miwjjnecq_yJessB6H6PJbu7X8cvzdnPQl6MXyzWXRGrn7trozoruftr6TDwo4r-m8AAAD__-IaHGY">