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

    <tr>
        <th>Summary</th>
        <td>
            Possible bug: DeclRefExpr wrong NonTypeTemplateParm decl
        </td>
    </tr>

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

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

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

<pre>
    Consider:
```C++
namespace ns1 {
        template <typename TA1, bool TA2>
        struct Template1 {};
        template <typename TB1, bool TB2>
        struct Template2 {};
        template <typename U1, bool U2, bool U3>
        struct Template2<Template1<U1, U2>, U3> {};
}
namespace ns2 {
        template <typename TA1, bool TA2>
        struct Template1 {};
        template <typename TB1, bool TB2>
        struct Template2 {};
        template <typename U1, bool U3, bool U2>
        struct Template2<Template1<U1, U2>, U3> {};
}
```
The difference between the class templates in the 2 namespaces is: `typename U1, bool U3, bool U2` instead of `typename U1, bool U2, bool U3` in the class template partial specialization.
A repro [dump](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QAJgAMfAQQCqAZ0wAFAB6cpvAFYgupWkwahkAUgkAhcxdLL6yAngGVG6AMKpaAVxYNJpVwAZPAZMADkfACNMYhAAZn0AB1RFQicGD29ff2TUxwFg0IiWaNiE20x7fIYhAiZiAkyfPwkKqvTa%2BoJC8KiY%2BP1FOoam7Nahrp7i0oGASltUL2Jkdg5mNkVEphWAagZFLh3TAHYrKQBBUykATgJMFkTDO6O4twIAT0TGVkwdgBVzvodpFUJ5/ucJKY4tgrpcbkNiF4HP97o8mHcuLCrtcTmc4TjjgARKF47F3B5PX5Qt6fb5sf4WIEgsF/CyQ6FY%2BEERHIv6oymQi7Y3GcgnEuKkm7ktHPakfL7rX7yJmg2g7eStYGq9VxKEwoVcnkEFEU9GYdluPmmjHU5WkdXs7D2%2BS6jkGgmSsUkrFE2GKzbbX77CRHU6i6WUl40hU/cEqlkQvWihFI41WmWYTHukXZ30S8P8s1R%2BV036s%2BNq1mO5Pc1MmjOC/E5pt5z0Roty2mK9UVnX25lqjVJ90p3mFu4W9OUzGvO0OvXO136luek7i0m%2Bg3nELGlhMEIQWahjeEjjzWicACsvD83F4qE4bms1h2ikWyypEgSvAImjP8wAaxAS8ABYADopBAgA2a5rmOOIAA5rikOI4muS9LwMTgQN4Fg9CkGRby0UgHw4XhFBAGRfw4LR5jgWAYEQFBUAeOgYnISg0FY%2BhYmQQxjC4BCuBkGhaDuYgKIgSI/1ISIQnqd5OB4WT5OId4AHlIm0TAHCU3guLYQR1IYWhFJo3gsEiLxgDcMRaAou9SCwPdjHEcynLwYgdMcAA3TAHOIzA1B0rw7hkndKj0gw8EiYgFI8LAou5PA8McvziBBZRCXuIxgFoEJQHM%2BYqEMYBFAANTwTAAHd1IVKL%2BEEEQxHYLgQNkQQlFUDR3N0fR%2BJMZ9LGiyIKMgeZUESaoHIAWiGdAoUJMxLGsaQdhmgB1BhUBmrwGAA7bqoYGb0WSqy7kUe90uIPAsDGw82m89IXAYdxPGaPQAleqY%2BliJIUjSARRj8f68nSH6Sn6QZKiegROhGd7smh9o4eGboQl6SG/tsNHgc%2BiYGghmYuHmN8lhWPRzyvG8ZNInY1AQqCZqgkCdj43KdkEsCuAgnYIFwQgSCOL8SZ/P9ZkA%2BI4jA1DZbl%2BWsI4HDSDw1CZfljXUKg0giPvThyMo0hqNo0h6KYxYCESUKOIgTB8CIG70E%2BxrhFEcQ2o6hRlHUGS%2BtIaq4sSPSqY4a8ddpzh1NCq3jVQKh6cZ5nWfZ4xOYQ7neYgDxuJiYWElmMWivmBBMCYLBYgei8ldwvRL25qDjlAhDLwIhChIQuJWl1kj9dsQ3jbPU3GIgJAmCGG2uMSNjiDCH5OAZpmWbZga04zwL7ZIW7nbkZr3fal2up93r8Zhhxntt168eOBCvvQIn%2BhAmRckBjJEb8a/SGf6p79iR/HrP1GXQr6YTsLDGoaMf4gD/gTRob8QCNxxpMDG0wH5SHmNyTAmAt5oMVmHbupFzhDB2JVGqucF5J2XhzLmPMpB8wFg7POQJs5Tx4owguRtxYh2VnhS8PMQKwS4IJLgUFLzXxAh3cO7lSIGyopw0gQEQJ13QnEAiEgoLCWuFBKCUhtZVziDTKRvcB4S0VhIGuwlCIRzIhwoupB0qpGcCBIAA) is provided.
While the expected difference is just the template parameter order, this is not the case.
The AST difference is:
```
| |-TemplateArgument type 'Template1<type-parameter-0-0, TA2>'
|   | `-TemplateSpecializationType 'Template1<type-parameter-0-0, TA2>' dependent Template1
|   |   |-TemplateArgument type 'type-parameter-0-0'
|   | | `-TemplateTypeParmType 'type-parameter-0-0' dependent depth 0 index 0
| |   `-TemplateArgument expr
|   |     `-DeclRefExpr <line:2:31> 'bool' NonTypeTemplateParm 0xcf3a360 'TA2' 'bool'
|   |-TemplateArgument expr
|   | `-DeclRefExpr <line:11:38> 'bool' NonTypeTemplateParm 0xcf3ada8 'U3' 'bool'
```
```
|   |-TemplateArgument type 'Template1<type-parameter-0-0, U2>'
|   | `-TemplateSpecializationType 'Template1<type-parameter-0-0, U2>' dependent Template1
|   | |-TemplateArgument type 'type-parameter-0-0'
|   |   | `-TemplateTypeParmType 'type-parameter-0-0' dependent depth 0 index 0
| |   `-TemplateArgument expr
|   |     `-DeclRefExpr <col:33> 'bool' NonTypeTemplateParm 0xcf5a4f8 'U2' 'bool'
|   |-TemplateArgument expr
| | `-DeclRefExpr <col:38> 'bool' NonTypeTemplateParm 0xcf5a490 'U3' 'bool'
```
Why the `clang::NonTypeTemplateParm` `TA2` is present? Even though it is not in the current semantic context.
I really think this is a bug, and the second result should be the correct one.
Thanks.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcWNmOo7zWfRrqBnULzHxRF4YAITMhhCJ3DMY4jGEIJE__i1R1VfXwdffR0Sf9OhJSjPFeXt5esJcTtC3BJULPlKBSwuwp6Lu0ap5jFMR5FWV5hUn0FFbx7VmrypbEqKE4SDEzioGUyLxeGgXU6Xr0lkGB2jqIEF22LE1Jb90Uo3SoqPOgQzTFad2tRtNI-gBZCmh0WFU5fYCA4vT38W3X9FFHH97CXsGkGcX9CVL9BKn-DhL8LaT7geiCjyb3O2yK096pU5z2CuE-6EyNKfan6aXZz0kE_4tJ5D7n819K4rs-X28PKaJjkiSoQWWE6BB1A0Il3aWIjvKgbelvpFuavHYD-n0fWpq0FAdpSmT-vB6RoUnZdiiI6Sr5x5DvdPQI-QUXug6ajgQ53dYoIkFO7kFHqvLr65Ig3aC6qWhKUOO-qClhRgE57bp64koBgwIGruKwyruvVYMfHdyd4uDWX-EUGuolFmxthP6w89W1Vqj7WF1Bg7W1CAY7XYPr-6B2ayhBezC6ta3e4B4ry872dXhrScjYcIHhOoG2rV3giRmgAVUxqq_Q8HFfe9kQpBl0cQbTaIxXK_EGS2weTRGul3UAj6O_WdTHAZ528LSGsyyB2mbtpxCeSgaq7N6wSWTOgJIk4OCOg4EZi3jBhuiAGaXE8lNITgRmt2Q3ZMvL9RBQQABqtdDkJfEf7R1rbKugkDZB2tQSYSoTOnnnrsAii7FQbLKjXqceDPDJWKXcAc79ZmmrqnvL4AEv1kZ2mG3FLd8NFjwwB_OYDTFWj_drFdeGuxAoYPTRYunzHW7qKMw2xODnO0Wq5GIe9Sut6aJDEfGH8xnD_dLgJYNThd2LYHdiEgptwnuWjttpm7SbLRqvnHV9P7euYnUrbCL5nBnhUu-XWSFl3XwXZMlKal6k26LAAEvI6XzzohzHpT5Ux6jMdEN3FdOP835XFOe5K3hZ_NJKM_CAdsRzZuLCad2sMXRgLu9h-CJJ2n7uikT03JxnUpcCRqRf8sy-eiQ1LJ71Cs8_zPvs5cQxjryTW3b_QDsynNg-WpsLW2yFXcSui_NWo4ChC3Un3Jl91d1AsVTcY_kChPxyPi4UpuYKo-c9ZevezeuW2V5ftiwn5j3KJMIUDzzMlfrKzNO1btlekJ6Rfj7fPRJBrb3OZM7gLzofFi2bApJ5t1utY-cKreK8kwcYjNCRoerDWVWrEEMQCE2x3VoQCg3JthZf9I6yGtYHbG94AytaZu7DG-Pi-cC_pIYKzX0y8Ku9cMYe9HXbUF2IttgvLQczb1uU-oVtj2eNV7Vezcw0mPU-XlrYsShgsJZj2eUlFrYq7x2ErRXzcJ5bBXOAc83lcL_y7T1r-V5qLCoOtzpZjXgWrfcBrHrF0YZdfJ7r0a1cDT6O1xGEkzC31h2yKtMMUpqV8fLM4EHWiY8NS17Bqhd2UF5H1ztR1dNee-mtERuVvrDn6wdh_6KvfdWAcHMYDhDOY9Y6LldvctPtce6vsL3JbDs33Nme2zDJ6xYv1idlZZKbtVxjdHJ1J6jmFvSIGcPKXazHldkGdpwWWGXV1FWLZjAhlMJL5Zsh4zmXm5S5SGF6awfbmTnIoJAV6wX68bgzg50Nc3R5zWhOFpZ7duB-f5YTUS6dueiUon1aEoT329SMpbZIlYpHZljZueiYFDC6djPH0SOc-CZOC7-fFxs5T73d_n67mvJpY5U-C-2LdrrgTIvPPLeMM73VeohL3zIGGzvadiU7JwoYO-WUwQeYxZ8hOzuF-ePOay1-PnNmA6udkvz84i4xg8nuekhv64pJL5uKScWlP_qa7rjLrYUPqqxZpsToj_CxSQ09skElpvt87prOo7ezggvfOjvn4vOBHMf1PWU32oU7H-1lKkYnofSSEz9ufVsqkY9nY78gvqfnxdoj10JV15q_Un2MiJzHw3W_AsJlds5hOlsNVqqllt0vvJzNzkrc2tw53LmcaeEFLDTTBP3a2ZzJTJsLW3iqCy884YDh78NKOlmeVIbZqeGSIAd9rXCNfErTsew6VpTRVtWuV9sqX18BWOyjTD0v9FAOKGA4ZiLWkkL2FDDmzY41X-xG9A_tamZWwTrh8WwqRod9Fcq2thnHej0zmWEuOPNiczvAAnZCtT4W87CvjXs6U8HiaF76yBAW4CW9r4rdulblwcDSbmsvWuEw8tWA-303-ik4lqkj79b2cnB4a7HCrrG6v4ww5aKtlDuWeavqgcG2bi9Yzi51SHRcrTSvN9Sl5qbd6Xgns8Nyf41U3mGOqWX2Q65Z-7uVDlVfq8ylNiNNtSCkgEKTlq6b6kpiFL9VYS8lOXrUbjTWKOpQ_NlnkJY-9233eP65qgcF6lBDV81kqYFGdymZTAZdVq9jo6BFXz-cC3QO36P-bMO_2R-NpiTtyzfbBBvcF6js6MmE0BSQPvupqe_LO5kvzBdmovJmIYH0gUjTD1yRecd1vjMkh_8cnI5Rjcp4ovYR9cOE9O-X8qsZfib9A_GJ6i5oisPvQD6Ri1HdpfTkz2I00t9neZriE_Q7QTTWzc9reR08Q1G-R4k-1s1kj3NSIoqbkgI59mFngTS5wonE5jWx3-An1jQzRgkXcCLzSDcE07iPkB8m_Ttm_8yKZSda8l_TigN5GjjZ4V-w-kGoP-v2D9v9Z3G5_6Jw3f9At_-9an_m_f9Mt1GVT9rg_lIbQsAnr9r47xT7D3p9Y_O3ShUCXmH-Wqleent8kimRifKgxNOnl4O_wJ6OcZTITG_ldKCbKgVqUdlRnEHr18dhs-pxSpPu25f-26Gvb5pprS0qgrIjER1VZYfG7q0AWHSDgjyfWJAyey8VAR32eJJmUMYPmBZFVRnTDWr7vKPbtOrzmA5fa1NUNQ2KOroqP8pKUGbt281T_MzFCqcET-iZlVhBUhhREJ_SZzGSgJgoTBJKfKhIAqeIgqQkTBgDJuJj7ok8AwbwjMAKrMgxAv-VlZAgIpaP5CQAUZJQPIOKgORf8_xaTAfRJ9K2PXpWAFDAUx6EKG8ffz8BUKKBfjykAKCE2VPzPMV8CXvcUjyTk7ZrP1A60uXoeVe1LQlz9MgFB-nPwhiaqsS_FEGMovypb_LnH07LpEv78GtUFRQwponefr7UTXVGUUcB40GvpYDxoP9_AQAA___YKPq5">