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

    <tr>
        <th>Summary</th>
        <td>
            [clang][diagnostics] diagnostics can be more clear when forming pointer to member from parenthesized expression
        </td>
    </tr>

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

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

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

<pre>
    ```cpp
struct foo {
    int val;
    void func() {}
};

int main() {
 int foo::* ptr1 = &(foo::val);
    void (foo::* ptr2)() = &(foo::func);
}
```

Diagnostic messages of this code are "invalid use of non-static data member 'val'" (line 6) and "call to non-static member function without an object argument" (line 7). (clang 18.1.0, <https://godbolt.org/z/YhGvWrTTb>)

These messages can be more clear like "cannot form pointer to member from a parenthesized expression".
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx0U1FvozwQ_DXLy6oIlgDhgYe2-fL9gUqnezR4A74zNrJNetdffzKkDbpeJSvB3p3xzNgW3qvBMLdQPkF5SsQSRuvat9dF-aSz8ncLVbaNfp4hO0H26INb-oAXaxHqp20NEVGZgFehoditXa2SeFlMD3QEalZAfdrq8eO9d_uNDJNQZte8McXCxVooHuOgR5yDyxGKEwJVQMePWtyfms8S9j03PMXG20afiTbNd6a76vc89sJPSgzG-qB6nNh7MbBHe8EwKo-9lYzCMQKRMlehlcTFc6wbax58EBEmRRA48dSxQ6B69VEDUVSulWGsolBhohXqhdYY7B5_g0bZQVmDryqMdgkoDNruB_cBhRuWiU3Yk9ZATRpnvRZmwPyY5mkG9IxQPI8hzH6N6wx0HqzsrA6pdQPQ-Q3o_H38__rNvbx0UPwXk9rF8TKy53sSvTDYMU7WMfaahUOtfvJmxBgbj9ZNOFtlArvo692MsxMKnIVjE0b26o0l8q_ZsffKGiBKE9kWsikakXCb1_mhouMxz5Oxzfqykr2QXDey5FwUlWwuTZ539bHgippEtZTRISszyspDVeZp3fXiUItcFpKoFAyHjCehdKr1dYq-E-X9wm2THYkSLTrWfn02RGt6QBRfkGtj_0O3DB4OmVY--DtDUEGvb21DlCcon-TH3fFQnnA3_UdwryObNS5lhq8S-yqvZHG6_etUVRiXLu3tBHSOKm9_D7Oz8dIAnVfTHui8-v4TAAD__-WgSHY">