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

    <tr>
        <th>Summary</th>
        <td>
            Diagnotic message about private members is printed for namespace scope entities
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c++,
            clang:diagnostics
      </td>
    </tr>

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

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

<pre>
    Consider the test for CWG16 (shortened to remove unrelated diagnostic):
```cpp
namespace dr16 { // dr16: yes
  class A { // expected-note {{here}}
    void f(); // expected-note {{here}}
 friend class C;
  };
  class B : A {}; // expected-note 3{{here}}
 class C : B {
    void g() {
      A::f(); // expected-error {{private member}} expected-error {{private base}}
    }
 };
}
```
Clang post-17 trunk output reads the following:
```
<source>:9:7: error: 'A' is a private member of 'dr16::A'
    9 |       A::f(); // expected-error {{private member}} expected-error {{private base}}
      |       ^
<source>:6:13: note: constrained by implicitly private inheritance here
    6 |   class B : A {}; // expected-note 3{{here}}
      |             ^
<source>:2:9: note: member is declared here
    2 |   class A { // expected-note {{here}}
      |         ^
<source>:9:10: error: cannot cast 'dr16::C' to its private base class 'dr16::A'
    9 |       A::f(); // expected-error {{private member}} expected-error {{private base}}
      | ^
<source>:6:13: note: implicitly declared private here
    6 | class B : A {}; // expected-note 3{{here}}
      | ^
```
I don't think statements `'A' is a private member of 'dr16::A'` and `member is declared here` (pointing to `class A`) make sense in isolation, and those are not the messages we should see here. I think we should be saying something along the lines of `'A' is a private base class of 'dr16::B'`, and the note shouldn't be printed. Another option is to base error message off `base class subobject` term, which may or may not make the note about where the member is declared useful.

Good first issue?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVt1uozgUfhrn5qgRmCQkF7kgyWQ0T7DXxpwEb42NfA7t5u1XNjQ_7bTaWY20K6Gmxvb5fs4HWBGZs0PciuVOLA8zNXDrw_aba4y1dlb75rLde0emwQDcIjASw8kH2P_xPV-BkGtqfWB02AB7CNj5F4TBBbSKsYHGqLPzxEYLuRFFJbKDyCqxysZL9_14x6kOqVcaoQmxbrkDIY9CHtNYFBVckMalANoqIqjuV-FfPWrG5sl5xjghyl2LAUV5iNe0EeDFmwZOQq4TnV_bfgoGXTOh70Wxeysbl9xG4_wOIulqrHX4FKr4BGsCSUV2qcijhPMo4XEGoIoWF9UXAjEEHyaFfTAvihE67GoMI_7XK2tFHyy9De59uN699noc7q1yZ-g98VNeAofBPYMfuB8YAqqGUspO3lr_atz5Y2KmYbEnPwSNovgmiiomq4xWJc7xHyHLSsgSDIGCR53gT3F6ypUoqrjwJid6uof_zk64wxfLbz_VG4nnRdQZQxR_tXfEQZn4HNYXMF1vjTZsL1fxxrUYDCunEVLcroirCfG3BPedgq91yKl3VxlThwxBg9qqgM07rvKB6796BTzS-4xapJVnD5nSyjnPoBXxY4D2MWnswTDBfWsnlv_7sP3zmN3l6tqgt_o_C9XvjdSN5-Pb4Ac03glZMnBr3DMQK8YOHRPENb_6KlhloFwTt34Wx1UWv3y9N46NO8fWx2_ZGMmEuIFOPSMQOopPHhjyVrGJLPepOLeeEFTAaG1653VIpM5I8IpArR9sA4Sjq3P4MSm7zdUIpC4RnXyHcfYMyvrIpkWwxiEldZ_ov4vnew92owc3ponjG_Doc42xkmNs5lA5z230so8CIwz7sf6YwkkY-FOic4dMQ-3rP1FzNJQxdBHztTW6hU5dIO5Vl2RQcvPKRNV-YHiN1kzWfWjTQHga7HyKS_r73fsGTiYQgyEaUBTHWbMtmk2xUTPc5mWWy2VZFKtZu13XNWbFoq51uZDZJquL9UIvylXZaMyzZT0zW5nJIs_lJs_lerma1yfcFPliWWw2WsqFFIsMO2Xs3NqXbu7DeZZAt2VRruXMqhotpVOXlFrIXbqkkPs4jp9IUVS3sxPFueVhFrax2lM9nEksMmuI6VafDVvcHtImNvrq--jWY_ApmjV1MB3nbucv0r5HQMeGDdJsCHbbMvcUw5Ge2rPhdqjn2ndCHiP69PPUB5-aKY9JKgl5TGr_DgAA__-Ojg8K">