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

    <tr>
        <th>Summary</th>
        <td>
            -Wclang-diagnostic-shadow-field doesn't work correctly with templates, inheritance, and parameters in non-defining declarations
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          higher-performance
      </td>
    </tr>
</table>

<pre>
    The code
```
template<class T>
struct Base { int index; };
template<class T>
struct Derived : Base<T> { Derived(int index); };
template<class T>
Derived<T>::Derived(int x) { (void)x; }
template struct Derived<int>;

struct Base2 { int index; };
struct Derived2 : Base2 { Derived2(int index); };
Derived2::Derived2(int x) { (void)x; }
```
[demonstrates incorrect diagnostics from Clang](https://godbolt.org/z/j869cn3je):
```
<source>:4:40: warning: parameter 'index' shadows member inherited from type 'Base<int>' [-Wshadow-field]
    4 | struct Derived : Base<T> { Derived(int index); };
      |                                        ^
<source>:7:17: note: in instantiation of member function 'Derived<int>::Derived' requested here
    7 | template struct Derived<int>;
      | ^
<source>:2:19: note: declared here
    2 | struct Base { int index; };
      |                   ^
```
Specifically, there are 3 issues (which may be related):
1. The behavior is inconsistent between non-templates and templates: there seems to be reason why the diagnostic should appear for `Derived` but be absent for `Derived2`.
1. The diagnostic triggers non-defining declarations unnecessarily: shadowing here is benign here; renaming wouldn't really prevent any problem.
1. The diagnostic fails to trigger on non-declaring definitions: if you rename `Base::index` to `Base::x`, the warning fails to trigger, despite `Derived<T>::Derived(int x)` shadowing it in the implementation.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVtuSozYQ_Rr5pcsuLHGxH3iwPesfyFbtsxANaCMkIolxnK9PNeCxvbM7O6kK5Qsg0X369DkSMgTdWsSSZUeWvazkGDvny063Hfr1gL5xvpdW4apy9bX82iEoVyNLXlhyYHmyfKbLiP1gZEQmTsrIEOArE1_moRD9qCIcZUBgxRG0jaBtjX8zcQRWvDBx_GyMF_T6FWtg4jDFY-JEc6awyxjju3sCvv8POW4B5phMHJg4PAelgFMuxnevTteM79-KeIoOz3iZOGkbp6ALjHfM8I-peY7H3wjgj6Xz39T-Nu2xNP7Z2n5oOMuONfbOhuhlxADaKuc9qgi1lq11IWoVoPGuh5ORtmXZC-O7LsYhUH5-ZvzcurpyJm6cbxk__8P4-fsu3ysrvuME__DzzOIU3OgVzl1K6ZsQIRfprbYtnQ7Syx4jemC8WPgoIHSydpcAPfYVetC2Q68j1jPMeB2Qpi_CWjrGC2DZcf1tfnbdaDQ11TJBAQBIgRUn-N8ECtNBIT95sOzLT3kpmDhs6QesI70fQFvQNkRpo5ZROwuuuVHRjFZNtxgv3ov2yQkFePxrxEC8dejxDruYYH_aA_dKf1UCKXW7fyyhRmWkf5eZP_bg9wvNRxzfsTyr7o8BlW60ksZcGT9BJAQgPYIAHcKIgZxz6bTqoJdXqBA8Eg_1o5S3G6BltMJOvmrnQc_GsUGHiDZChfGCaME6u74RGUDa-o1Wcs-SPCD2AaKbc8ngLFy6Kw0-eBBC50ZTgxwGlB4a54Hlya0peQLVSGlBVoEAPI9zliebJ-QPgaPXbYs-TGBrbDSZb-nQpK8Ao7WoMATptbkS8NlFNG-qQAeo0OrWzv0UR_BoZU_jF0JtGS8i1WbMFQaPrwRRWjp3lcH-l9gaqc1EzQISnF1gEroZJwGeYE7eaODqxjk9EgOze0n5s4TyhMI9DdDNRQq3teddYhqvMQw64iPvH-8xlOzOlCYVT0l0Pxjs0caJ3s2qLkW9F3u5wnJbbLdity326aorRV7xYpthLpo8y1HlBXJeZErke5WJnVzpkic8TQTPtlm6z9JNk8pKpuku26NAtVUsTbCX2myMee1pfV5NGi93ebYtVkZWaML02sC5xctsAMY5vUX4kp5ZV2MbWJoYHWK4R4k6GizX3xRtCet7w9aPyyvUDsPc-ovzf8KysZgrXHTsHpzAT7c1nN5S6JKc8rb2k7d-Lc7V6E35w36kYzdWG-V6xs-EeflbD959RxUZP89WZ_w8MfFvAAAA__9d9dvE">