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

    <tr>
        <th>Summary</th>
        <td>
            clang-tidy: [cppcoreguidelines-pro-type-union-access] sometimes does not report location
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-tidy
      </td>
    </tr>

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

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

<pre>
    [cppcoreguidelines-pro-type-union-access] gets triggered on any union member access. It uses `getMemberLoc()` function to retrieve the location of the union member (i.e. `unionMemberA` in `auto i = Z.unionMemberA`) 
here — https://github.com/llvm/llvm-project/blob/11aa31f595325d6b2dede3364e4b86d78fffe635/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp#L26

Sometimes this location is unavailable. For example

```c++
union Z {
  int a;

  template <class TP> operator TP *() const;
};

Z foo();

int main() {
    void *ret = foo(); // Triggers warning
    return 0;
}
```

This results in the confusing message, _note the absence_ of `file:line:col` triple:

```console
warning: do not access members of unions; use (boost::)variant instead [cppcoreguidelines-pro-type-union-access]
```

_____________________

There are two options to fix the issue:

1. Disable report if the member location is invalid:

```c++
 if (auto MemberLoc = Matched->getMemberLoc(); MemberLoc.isValid())
     diag(MemberLoc,
          "do not access members of unions; use (boost::)variant instead");
```

2. Use `Matched` location instead:

```c++
 if (auto MemberLoc = Matched->getMemberLoc(); MemberLoc.isValid())
     diag(MemberLoc,
          "do not access members of unions; use (boost::)variant instead");
 else
     diag(Matched->getExprLoc(),
          "do not access members of unions; use (boost::)variant instead");
```

or similar code.

Please confirm and advise.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkVlFr4zgQ_jXKyxBjS47jPPghbRo42IXCde9hX4osjR3dypKR5Gz77w_J6cYpvYPCwT2cMQnWaD5pvvlmJO696g1iQzZ3ZHNY8SmcrGt-eGcHbux51Vr5Go1iHIV12E9KolYG_Xp0dh1eR1xPRlmz5kKg92RzgB6Dh-BU36NDCdYAN6-QZsGAQ4sO5skZ_BZg8uiBVHmP4WsyfrGC0JrQHaly6CYjQnQMFhwGp_CMEE4I2gqeDLZL3zfwhNYqwyzCpvEZeB8BlYmjfAoWFBB2gO_ZuymE7oDkB5LvT-gQyAMldU52JZxCGD1he0KPhB57FU5Tmwk7EHrU-vz2F3n5E0Ug9Nhq2xJ6LArOWdFtdhtGN7JqqUSJjFUllm1dyW3ddR1WbEPoUWhu-nWwVvs1vgTHr2NKvsaP92kg9Pjo7NPriN9iGPtE7P0JxY9MjCOh7Aut5mjm39_tgEEN6CGclL_SqDxMhp-50rzVmMHROsAXPowal-6Rn_QKQu_im0Zn8r8D2V4GAJQJwAm7WzoDBBxGzQMCYfdCc-_h6ZGwB7AjOh6sg6dHIHQ_5x-ENT5cMbaHd3jfobP2opVbS1x94MpcgBb7AjhbJeMiDkMSwBID5tzC06xeDz-5M8r0V2-HYXIG8ptt3VKz3MhTJNmhn3TwUXtRqsKabvLK9DCg97xHQu_h2dgwK5u3Ho3A56hsUuWd0kjYPiabsL2wOqo4ODWm4Y9zY423b3l7i4DtQVowNlyK71IrPi6T8udj_JPHWD2ttZH5fVL77syd4iaAMj4gl_CpdvAP5Dx_9NyyFyuQO4Tw04Ido1J9bAWdeklcKe-n9zQUGRyUjyoGh6N1AdTcIi7NYSl5Zc5cK_m3RC5FHmEIrVPr-NWpkoK-8iBOKNeEPXzQxdjddXqm_B9pwdlEd1dhgVS8J7ReuN8vrOkhlP5LOSSU3lTNR-mhGXyLUFV-CTAq78reBej_Th2g9vjBXm4Ce3gZF2H914m1DrwalOYOhJWYLW2PGrmfe5RyA3Ajgcuz8pitZMPkju34CptiS1lZb7Z5sTo1bNOKvOhYsataioxuOKtYKUvZbQXmVblSDc1pmdcFLeq8YLssL8utrEUna9nl2JWkzHHgSmfxAM2s61epsJsip7tys9K8Re3TFYXS5XFI45XFNenYbafekzLXygd_xQkqaGwWPmz_ufYF_teBKS36lKNLW3krhdXkdPPpy0GKMB7flyDPDf0rAAD__8U46LU">