<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJy1V1uXorgW_jXWC-vUAgQvD_UQboqCipdSfOMSIQhESRD010-CVT3dPdUzPees40KJyc7O3l--JF9CHN_f9ikshTuuhTS4QYE2WIBlXZCeaPRE8PE7EJ9P1JM1_jxr5T4qo7yOodDr6wgTWsGg6PXN77tyX0KUB4QIpsTsgFCXBCUljAVU0g_L4YdHgX1MiZsZgvTZZvT62q88yr_lUf61x8_Evh-gSVGUPtFAMSwpioKcjRHDKr-jMhFuQV5DIvTkEeso8c7ymA0t0BQRIQoIFIIyFoKPGFm7zr7Cp1fSQUxhcckDCoVLUAUFpLAiPVlnHXkOMIEV75fxfk9f3Zi8DnW-EE0Fer90NUFNMXu9_vOEfQ7KZ6ukQtaNyHoL6NuksTmsIyro32BkRZYnS5CXCY0Z3uyJcE35pLOH4SCXuIQ9VS9ZkUHLTA3hH1HeMtrxAGrCMQ04EBQxoMkFRuyNHgFFuBTw6QPXDswTroQQs-SZM1N6xsII84kTr5U_auWuNkdn2Dngtf8eoL_A0tc71L4f-xvffwes7DvUeOe_Ae1fRvRd3v99RPLfRvTVNHLY-axEmAXKeFxCNk0kYKgHMSduEXQrI6CM2IQGbDWxbJ5rAIcZjOjvzQxPnrt6ZvPFIucpsIWo_zgzAuSvn8wkbvYDXAKUfzSrIK2rUhD_zJ3h8LdcZgCwfTAIMds1GlydCSsTnNcU5nfhhEooMDInUdTxFPE33ytKIYTCDVbohNj2xSx6qjbBcYhzyveXU53nnWOes2qwmpTSS4eYbLGH-XtNnuavuEq6yv6DNS99J0mBpV1j1dNb4DcrX3P1QlvHmgMsydMjEKxMHbiPRqMuGAKvsajraXewTsZz6vkmuBMUit4B6O1I08Aca-UWgB2YXhrg3oDlbzd0lkiGDS5A94FX-_U5Hx_BtjHmWQwm1o6CuUImUGrAHYK7D6Z2T1ZlDZiB3-oAPKz7GYAB1vF6aWhDeCur2dVXdG8zTR3LbEdh4I9vZ9dL1m4LNsdVqcziS7IchAdJs9_Tc2y11WG32Ma50Q_71sV3Qe4E-EC29lB7FCSa2v08AZIetOFZmWvuxq-mN3-WYpBc4kNmDMNCbOY6vfmHBUlkSXGvEUgHE7nxbNq6YOpXi5hSvZ83q5IA3QkdlBDTvgVeMTxAhayViaXe3PspHDDoV2x-rK0OlAl-mE1TNvLMzqeHaIrluS8r5haQtT3Z5kMw0MMw2GXhLIV2CkaDvj00nWYZHuvgPEfgcfC94XEag8QCDkDDUzjqHwu3ccHGNxvwnkXG1D0mbXBdO3aLl3W5VG-rRYeurHnXXGrzqJLQTW5oKt_gfIEs-Tioonn1biWSpkvLm9VZX40QWUG0oDeDMZXeqGPHj_pYXdXV3D_Nx0kt3q41S-uWD46GbLh-6JpBtmiz6KTpkSRX3vWkprW4P8nrynWO6_cLbYkTLJ1wFr_LY0f3m_W7tKjpajvJ7eHDiFZLWWzWg8Nulg78jROG0-NqeHTepcussVHjy42YDWKpUSIJl4AeOKuB4qw3lrdNrR0JmoW3nx1dfQFnENjb9elRAK1azvwELHN00EerhnXRgXEcm8rGS2YeMZaWonme0T_qHsPJ2iWKlcyAOFGXKS7tTSK7GwP5BViaD0NZpsu9PUE2AKfNOVvPjUK35zbyZ4OE0RtTJJsm0FQtDaxdmm30ZhFlU_O0HWlLAwMjdjXMmeBau_jSrvc7I9ldtwm07NADZnSboNWWOK5j9FfYbnTd02aB0egzpO2yhgDc2tuEPDZ2IcaXs3sebI8rcZ0mll7OzHojzacmnm9mszPSKADr9UhJ8wWKycLQPASAsgBgez47yQKIMS0w9bLBVdmkI7DTyXjhDedepRe-WixXYG9ELboC1wcWAIttwxb4NF64m3VqXc6etzbMOLmYy44qXm7s9Cye6k2bTUjQjk1UZLZRvGtmcZ3cgXVZ7Na7BrvESZo9vmPxtrGayTTatkU52kxn5WBim_l9YWvWxMLndGNNJtP0jLU82E2WiengdZESf46u20vKqPHcLfK2nYb6hU7G-lL3g6BYTdRktzfyTPRVV9tPOT0aMMrGK5Cl75OgQTdi39e0AEftPFk7CZnPdM2ekw0jYuMlG-CltvXuxRmLZ7U_Ii_Xj9Q2jGjWJGgYN0rGPSputpkAUW8hlrPNFFeeWvgt8CxpPWs3CgLQUZhdO9JtLmNYpPpSXLfGUl46l128HjtqcoC6PHDM8x7vlyaQ5LljPbbt3ri973Qc-rMgL_aq_37Zv0N5cTBiRelvT4s0cyAdGsMTPWfl0RrL1wVx5JNfXOSHOe0nKzhGsooI2TbR2WYHgdo3Pn7G359JGjviERVOAcrJUzAyCcWU1lM7sgPrhPMcN1x8FezMDhL45Sn88bevE1xXEeTaog_kIfuRRlx7w6rCFS8ERYiSGtfkF0qOcCnXk4efB_XPGor5_LeH-Q-fnmp-GWsXZhdqibmOAr9SmkVAo5TrelXrMMq6S4PIz93f1oD_EAvXVf-fWL5Sf18pFfsk2EzdFFymcBLwG0WnK5lW_nYnCaqkLtjFp9MqWU2okMPgzw4fVwbe41P3cPWHcvgkGheXlwqHOSx-vJSo2hRW8Cshw5RhdGYxVSdGyVfmjdVd2SWrIw4rDyVZGskMPn7TIt24FczhjelJYbMUYkSimhBm_PoSv_XjcX8cvLAwU1y9gUcVwLwviuJLXeVvPwkoFm4dfgyY57fP139Y_Fycsr9spbFAWEHtj0fyS_omq5EiRuF4OBqLQaQGoRRAVhKH4740UE7SSx6EMCdvLF1-NYKN0Lngolo1Xv73CNCbLMr8kcWxMu6PXmGkyCNViUNVGSv9YNxTRMi0cv7K_XBd-FK9dS7DOiGsMUeEkj8b2b2K355hFzCLkCKaw7fVBzG_keInhna07JjwV9o895yYXVhZM5ub59bQ9XvpknnrMvkD74T1Yw>53982</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Partial template specialization with auto template argument fails due to disambiguation
        </td>
    </tr>

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

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

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

<pre>
    When you have two enums

```c++
#include <iostream>

enum class E1 : unsigned int
{
    E11 = 1
};

enum class E2 : unsigned int
{
    E21 = 1
};
```

which have identical underlying values (`1`) in this case and a class `C` which has two template parameters, an integer `j` and a value `i` with type `auto`.

```c++
template<int j, auto i>
struct C
{ C() { std::cout << "none\n"; } };
```

Then, using a partial specialization of this class for both `E1::E11` and `E2::E21` like this:

```c++
template<int j>
struct C<j, E1::E11>
{ C() { std::cout << j << "E11\n"; } };

template<int j>
struct C<j, E2::E21>
{ C() { std::cout << j << "E21\n"; } };
```

and for completeness sake add a main that instantiates two objects:

```c++
int main()
{
    C<0,E1::E11> e11;
    C<1,E2::E21> e21;
    return 0;
}
```

The code above works absolutely fine on gcc and icc as can be verified on [Godbolt (full code)](https://gcc.godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxCAAzFykAA6oCoRODB7evnrJqY4CQSHhLFEx8baY9vkMQgRMxASZPn4JdpgO6bX1BIVhkdFxrXUNTdlD3b3FpYMAlLaoXsTI7BzmscHI3lgA1Caxbk4KBMSYrHvYJhoAgpdXjD7bm0wKCtvYXNsg214MqcAh6G2wQItxMAHYrNdttC3lwPnsACLbLigsEIvaQm7Xe4sR4GF5vMyfb6/PD/TCA4GozEwwnw2JIlHXcHo2KY24ETAsRIGTl7A6CbbaUjbJheIhA863I7ELwObZuakKiAzXYQ7ZHdAgFALAi7fb83ZmMwMASYEwAVjcDHMZgxaqRLIxoOunO5vPN%2B2BQql1xlcr1iv2wth2veKNiF2Z6rcKrVFg1BC1OvF%2BqDbiFacNtvDluttvtLIdzuZrq5PKYfK9gu0vqu/vl6ZD2DMYbMEajNxjcfBCc12rQqf5hu0Wf2RrMLZRVptxsLaOLbJdV29LCYwRV1NutPTGlI7zDcPO20wR6XUJh6YSLbbHZP7ZLV1pJwIiwY2w0j6d1w4c1onAtXg/A4LRSFQThFUsawNQWJZMCNeJeAITRfzmABrOJYgAOliXC8Pw/CADZ9E4SQgJQsDOF4BQQD3ZCQN/Ug4FgJA0G5OhonISg2MSDiYmAOEzD4OhOWIGiIAAfSkjRKDmCIKIiYJ6gATwoti2EEAB5BhaFUhjSCwNcjHEfT8BODoADdMBo/TMFUdpxRWUDgUqTgeFIbQAEcvGiPTsLMLD3PoIwCCQBJaDwCJiBUjwsAoxITgszSIm0dpkMk6TZP0RhgFCnJEuS1KHEoKSJJkiBtAARR84hlNidsNDBQiAA4NAATkkLgNA0dtmotQj6q4Sh8AUCs9NQ7KQrCmY5mOPAWDcxiqAMYAFAANTwTAAHdNMSRhFpkQQRDEdgpEO%2BQlDUCjdHCwxjGsax9EimjIDmVBEmqGyAFpNURUwoMsLgwWoyo0vSFwGHcTxmn8SHJn6GIElyNIBFGFokhSFGGHhkoBlaUGOgELoRmhsYKiqTphh6YI%2BlxxHbCptG9COCYaamPG5gUWDlj0Y5MBWHg/wA8j9PAjhVGawivsIyRtmAZBkGRLgsKJCBIKsSwRVwQgSAQhIFVQdj6GIPWZiQlCZtIDDcJwgi7dw4j/w4MjSGA0Cxeo2jSHorQ5mYxAQF1RJxS4iAeL4/x8CIen%2BCO0RxDO2OLpUdR9L5gXeC26LEkWoWOEA12KLFzTxWDvVUCobYJalmW5YVpWVe2NXDd443TfNhjLet7D7ftkjnZF92qNsL2fYmp2zEH3gPe9i25issTwckIA%3D%3D)

But it fails with clang with the following message

```
<source>:27:18: error: ambiguous partial specializations of 'C<0, E1::E11>'
    C<0,E1::E11> e11;
                 ^
<source>:18:8: note: partial specialization matches [with j = 0]
struct C<j, E1::E11>
       ^
<source>:22:8: note: partial specialization matches [with j = 0]
struct C<j, E2::E21>
```

If I remove the `int j` template argument and just leave the `auto i` the code compiles without problem.

[Here](https://stackoverflow.com/questions/71218222) is the relevant SO discussion.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1V1uTqroS_jXOC3WmBMHLwzyEm6KggjqKb1wiBIEoCYL--pPgzLrtWXuvfaqOFSUm3Z3uLx3ydYjj-9s-haVwx7WQBjco0AYLsKwL0uvrvT74-B32ny3qSSpvz1FpgMoor2Mo9AYawoRWMCh6A-NHVW5LiPKAEMEQmRwQ6pKgpISxgEr6ITn6sCiwjyFyMV0QP-f03kD9nUXpjyxKv7f4GdiPCzQpitInGiiGJUVRkLM1Yljld1Qmwi3Ia0iEnjRmiiJXliZsaYGmiAhRQKAQlLEQfPjI5jX2FT6tkg5iCotLHlAoXIIqKCCFFelJGlPkMcAEVlwv43pPW92afAx1thBNBXq_dCNBTTF7vP7zhn0uynerpELWrci0BfRt09ge1hEVtG8wsi6LkwXI-4TGDG_WIlxTvumsMRykEpewp2gl6zJomagu_CPKW5Z23IGacEwDDgRFDGhygRF7okdAES4FfPrAtQPzhCshxCx4ZswQn76whPnEiY9KH6NSN5qjM-wM8NF_D9BfYBloHWo_rv0t3_8ErOwH1Ljy34D2Lz36Ie7_3SPpbz36ahs57HxXIswcZXlcQrZNJGCoBzFP3CLoTkZAWWITGrDTxKJ5ngEcZjCif7YzPHhu6hnNF4ech8AOovbzzgiQP34RE7nYT3AJUPpZrIK0rkqh_z12hsPf5jIDgL0HgxCzt0aDqzNhfYLzmsL8LpxQCQWWzEkUdXmK-JO_K0ohhMINVuiE2OuLSfQUdYrjEOeUv19OdZ53hnnMis5GUkovHWKSyRqz95o8xV9xlXSDgwebXvl2kgJTvcaKq7XAb9a-6miF6sWqDUzR1SIQrA0NOI9GpQ4YAbcxqeOqd-AlkwV1fQPcCQr77gFo7VhVwQKr5RaAHZhdGuDcgOlvN3SeiLoFLkDzgVv79TmfHMG20RdZDKbmjoKFTKZQbMAdgrsPZlZPUiQVGIHfagA8zPsZgCHWsLfS1RG8ldX86suau5mltmm04zDwJ7ez4yae04LNcV3K8_iSrIbhQVSt9_Qcm2112C23ca4PwoF58R2Q2wE-kK01Uh8FiWbWIE-AqAVteJYXqrPxq9nNn6cYJJf4kOmjsOg3C43e_MOSJJIoO9cIpMOp1LgWbR0w86tlTKk2yJt1SYBmhzZKiGHdArcYHaBMPHlqKjfnfgqHDPo12x9zqwF5ih9G05SNNLfy2SGaYWnhS7KxBcSzptt8BIZaGAa7LJyn0ErBeDiwRobdrMJjHZwXCDwOvjs6zmKQmMAGaHQKx4Nj4TQO2PhGA96zSJ85x6QNrp5ttXhVlyvltl526Eqqe83FNo8qEd2khqbSDS6WyJSOwypaVO9mIqqauLqZnfRVD5EZREt601mm0hu1rfhRH6ursl74p8Ukqfu3a83CuuXDoy7pjh86RpAt2yw6qVokSpV7PSlp3d-fJK9y7KP3fqEtsYOVHc7jd2lia37jvYvLmq6309waPfRovZL6jTc87Obp0N_YYTg7rkdH-128zBsLNb7U9LNhLDZyJOIS0APPaiDb3sZ0t6m5I0GzdPfzo6Mt4RwCa-udHgVQq9XcT8AqRwdtvG6Yigb048SQN24yd4m-MmXVdfXBUXMZTuYukc1kDvpTZZXi0tokkrPRkV-AlfHQ5VW62ltTZAFw2pwzb6EXmrWwkD8fJiy9MUWSYQBVUdPA3KXZRmuWUTYzTtuxutIx0GNHxTwTHHMXX1pvv9OT3XWbQNMKXWBEtylab4nt2Ppgja1G01x1HuiNNkfqLmsIwK21TchjYxX9-HJ2zsPtcd330sTUyrlRb8TFzMCLzXx-RioFwPPGcpovUUyWuuoiAOQlANvz2U6WoB_TAlM3G17lTToGO41Mlu5o4VZa4SvFag32etSiK3B8YAKw3DbsgM_ipbPxUvNydl1PN-LkYqy6VHFzfadl8Uxr2mxKgnZioCKz9OJdNYrr9A7My3Ln7RrsEDtp9viO-7eN2Uxn0bYtyvFmNi-HU8vI70tLNacmPqcbczqdpWes5sFuukoMG3tFSvwFum4vKUuN59sib9tZqF3odKKtND8IivVUSXZ7Pc_6vuKo-xlPjwaMs8kaZOn7NGjQjVh3jxbgqJ6nnp2QxVxTrQXZsERs3GQD3NQy3904Y_6s90fk5tqRWroezZsEjeJGzrhF2ck2U9DXWoilbDPDlasUfgtcU_Tm7UZGANoyk2vHmsVpDPNUW_W9Vl9JK_uyi72JrSQHqElD2zjv8X5lAFFa2OZj2-712_tOw6E_D_Jir_jvl_07lJYHPZblwfa0TDMb0pE-OtFzVh7NiXRdEls6-cVFehizQbKGEyQpiJBtE50tdhEoA_3jZ_LjnaSyKx5R4RSgnDwJI6NQjGk9uSO7sE44z3HDyVfB7uwggV_ewh9_BxrBdRVBzi0GQBqxH3HMuTesKlzxTlCEKKlxTX7D5Aincj1p9HlR_8qhmM1_e5n_9Okpxpe-dm52rpaY8yjwO6ZZBDRKOa9X1A6jrCsa-vze_WMO-A--cF71__HlK_b3FVOxToLF2E3BaQpPAl5RdLySceVvNUlQJXXBCp-Oq2Q1oUIOg-8KHyUD1_jkPZz9oRw-E42Ty0uFwxwWPxclijqDFfyKyDBmGJ2ZT9WJpeQrs8bGrqzI6hKH9UeiJI4lBh-vtEi3bgVzeGN8UtishBiRqCaECb--xG-DeDKYBC8U0Ry-rT8A_hbcL0h38HYR_TX859mJWeHFptkazxTv9F7qKn_7hYwxS3X44Xye3z4f_2FYcKLL_rJTy4JiHWUwGUsv6dvpdJpIyliKo1iUTvAU9IcyhMFoeBoNgyEcv-RBCHPyxqDjZRZshM4EJ-iK_oLepL7Em9SfyJPB-BVGsjRW5DhU5Ik8CCY9uQ8Za85fuR-cIb5Ub51LYZ0QNpkjQsn3SVZh8Toadssx-wyWFFdv4FEFMB_0-_2XbvW3zvv_AqUD4Pg">