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

    <tr>
        <th>Summary</th>
        <td>
            diagnose_if runs within false branches of C++ `if constexpr`, leading to false positives
        </td>
    </tr>

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

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

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

<pre>
    minimal reproducer:

```
#include <cstdio>
#include <cstring>
#include <cstddef>

void *copy(void *d, void *s, size_t n) __attribute__((diagnose_if(__builtin_object_size(d, 0) < n, "n larger than d", "error"))) {
    return memcpy(d, s, n);
}

int test(long long v) noexcept
{
    int r = 0;
 if constexpr (sizeof(r) == sizeof(v)) {
        copy(&r, &v, sizeof(v));
    }
    return r;
}

int main() {
    return test(16);
}
```

compiling reveals:

```
$ c++ test.cc -o test    
test.cc:13:31: error: n larger than d
   13 | copy(&r, &v, sizeof(v));
      | ^
test.cc:5:55: note: from 'diagnose_if' attribute on 'copy':
    5 | void *copy(void *d, void *s, size_t n) __attribute__((diagnose_if(__builtin_object_size(d, 0) < n, "n larger than d", "error"))) {
      | ^           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
```

The condition `sizeof(r) == sizeof(v)` is always false in this case, yet the diagnostic is still invoked, like if it was true. This does leads to a false positive at compile-time. The workaround is obviously easy (to use `sizeof(r)` instead) but should not be necessary.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVc1y4zYMfhr6golHJiPJOejg2Jsn2LuHIiEJDUW6JOWse-izd0jJjptm005vy5EpwyB-vo8ALEOg3iI2rHxm5WElpzg43_xeVavW6UszkqVRGvB48k5PCj0TO1YcWHHdq2J5ZpELsspMGoGJvQpRk2Pi20-Unmz_c63W2L1r8352pIHxnXKnC-Pbq6gZ38NVCEkI9AceI1jGn-B4lDF6aqeIxyPjW8a3mmRvXcAjdYxvj8d2IhPJHl37G6p4TNbpVPJUJBdM7JOvPTDOLRjpe_QQB2lBM84XBXrvfBaf5gdY_TznDQDgMU7ewoijysln7znZlCUTy1FWH-4Rk40QMUTGt8bZHvJ2Ts6twx8KT_FqdhcqGXlg4gDFzS9QB8rZEPHHyQPj2wTSJfh-RnhI528_nj-DkNZCPeOVn3FX5yvh94bvcQHghumOB_8V4lGSzUE-53AhZFN9TtyHksy7cuOJDNkePJ5RmvBvdfwIivFnxp9ztLVS8ODy1wwoH1oUTOw2gomd2DCxg7kKxA4-1skVxEYAq_f_i0fIlqz89jF-mT5ljuoipnfn3QiM13-r9BpunQDOJvWcRX0jI8Uoc5RfudVuPMH7-vPrNRtv5uuDHi16GVGvvyip7wOmjtIUKZFZFf-ho6oCKIA0b_ISoJMmIJCFOFAAJQMmeBeMEAeEhbhIKpmESMYA2bN7xUyWoVdMPU0R3mSA6Cdcw_fkSDsMYFDqANGBXMKcXKBIZwQZYW4GfIg0ZiOEN-dfpXeT1SmYa8_kpmAugDJc0rCIDqaA_wCZ8aSZInWC3E4RwuAmo1MdQotgUWEI0l_WK90I_SSe5AqbTV0IXlfbTbUaGrUtdNUh33RtqVqhCyx0y8u2a7tW1HyzooYXXGw457zgVVmtOaISHMu61u1jJ7bsscBRklkbcx7XzvcrCmHCpq549bgyskUT8h8c5xbfICtT8ZSHlW-SzUM79YE9FoZCDO9eIkWDzV0Bg59sgDeKA9mF1tZLqwYM4DrYLwODVcX9sE1lky4MpU7zJ7oPNxJWkzfNEOMpDyX-wvhLT3GY2rVyI-MvKaHl9XDyLvUN4y8ZRmD8JcP8KwAA__8TcU57">