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

    <tr>
        <th>Summary</th>
        <td>
            Ambiguous Template Specialization with Xtensor
        </td>
    </tr>

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

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

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

<pre>
    Sometime in the last month and a half or so, LLVM has broken for the C++ xtensor header library (https://github.com/xtensor-stack/xtensor).

I have a minimal reproducer, `main.cpp`:

```C++
#include "xtensor/xarray.hpp"

int main(void) {
  xt::xarray<double> temp;
  return 0;
}
```

compiled as:

```
clang++ main.cpp -I/path/to/xtensor/include -I/path/to/xtl/include
```

It works fine with llvm 18.1.0, and up to 1c683eb324aea08b2f9de26cac27532da8a0f7e3, but was broken somewhere between 1c683eb324aea08b2f9de26cac27532da8a0f7e3 and 05f4448d40f00b9fb2447e1c32cd18a7a9b8b011.

With the current develop version of LLVM, it gives the following error:

```
clang++ main.cpp -I/home/jtramm/openmc_offload/openmc/vendor/xtensor/include -I/home/jtramm/openmc_offload/openmc/vendor/xtl/include
In file included from main.cpp:1:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:19:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xbuffer_adaptor.hpp:21:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xstorage.hpp:23:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xtensor_simd.hpp:17:
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xutils.hpp:896:31: error: ambiguous partial specializations of 'rebind_container<long, xt::svector<unsigned long>>'
  896 |         using type = typename rebind_container<std::ptrdiff_t, S>::type;
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xutils.hpp:924:5: note: in instantiation of template class 'xt::get_strides_type<xt::svector<unsigned long>>' requested here
  924 | using get_strides_t = typename get_strides_type<C>::type;
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:53:30: note: in instantiation of template type alias 'get_strides_t' requested here
   53 |         using strides_type = get_strides_t<shape_type>;
 | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:36:43: note: in instantiation of template class 'xt::xcontainer_inner_types<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 36 |         using inner_shape_type = typename xcontainer_inner_types<D>::inner_shape_type;
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:64:11: note: in instantiation of template class 'xt::xcontainer_iterable_types<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 64 |         : xcontainer_iterable_types<xarray_container<EC, L, SC, Tag>>
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xiterable.hpp:43:43: note: in instantiation of template class 'xt::xiterable_inner_types<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 43 |         using inner_shape_type = typename iterable_types::inner_shape_type;
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xiterable.hpp:151:30: note: (skipping 1 context in backtrace; use -ftemplate-backtrace-limit=0 to see all)
  151 |     class xiterable : public xconst_iterable<D>
 | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xiterable.hpp:311:42: note: in instantiation of template class 'xt::xiterable<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 311 |     class xcontiguous_iterable : private xiterable<D>
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:71:31: note: in instantiation of template class 'xt::xcontiguous_iterable<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 71 |     class xcontainer : public xcontiguous_iterable<D>,
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:260:39: note: in instantiation of template class 'xt::xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 260 |     class xstrided_container : public xcontainer<D>
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:82:37: note: in instantiation of template class 'xt::xstrided_container<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 82 |     class xarray_container : public xstrided_container<xarray_container<EC, L, SC, Tag>>,
      | ^
main.cpp:4:22: note: in instantiation of template class 'xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>' requested here
    4 |   xt::xarray<double> temp;
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xutils.hpp:883:12: note: partial specialization matches [with X = long, C = xt::svector, T = unsigned long, N = 4]
  883 |     struct rebind_container<X, C<T, N>>
 | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xstorage.hpp:1415:12: note: partial specialization matches [with X = long, T = unsigned long, N = 4, A = std::allocator<unsigned long>, B = true]
 1415 |     struct rebind_container<X, svector<T, N, A, B>>
      |            ^
In file included from main.cpp:1:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:20:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:23:
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xiterable.hpp:45:50: error: no type named 'stepper' in 'xt::xiterable_inner_types<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
   45 | using stepper = typename iterable_types::stepper;
      | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xiterable.hpp:151:30: note: in instantiation of template class 'xt::xconst_iterable<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 151 |     class xiterable : public xconst_iterable<D>
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xiterable.hpp:311:42: note: in instantiation of template class 'xt::xiterable<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 311 |     class xcontiguous_iterable : private xiterable<D>
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:71:31: note: in instantiation of template class 'xt::xcontiguous_iterable<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 71 |     class xcontainer : public xcontiguous_iterable<D>,
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:260:39: note: in instantiation of template class 'xt::xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 260 |     class xstrided_container : public xcontainer<D>
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:82:37: note: in instantiation of template class 'xt::xstrided_container<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 82 |     class xarray_container : public xstrided_container<xarray_container<EC, L, SC, Tag>>,
      | ^
main.cpp:4:22: note: in instantiation of template class 'xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>' requested here
    4 |   xt::xarray<double> temp;
      |                      ^
In file included from main.cpp:1:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:20:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:23:
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xiterable.hpp:46:56: error: no type named 'const_stepper' in 'xt::xiterable_inner_types<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
   46 | using const_stepper = typename iterable_types::const_stepper;
      | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
In file included from main.cpp:1:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:20:
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:140:15: error: using declaration refers into 'accessible_base::', which is not a base class of 'xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
  140 | using accessible_base::at;
      | ^~~~~~~~~~~~~~~~~
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:260:39: note: in instantiation of template class 'xt::xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 260 |     class xstrided_container : public xcontainer<D>
      | ^
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:82:37: note: in instantiation of template class 'xt::xstrided_container<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>' requested here
 82 |     class xarray_container : public xstrided_container<xarray_container<EC, L, SC, Tag>>,
      | ^
main.cpp:4:22: note: in instantiation of template class 'xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>' requested here
    4 |   xt::xarray<double> temp;
      |                      ^
In file included from main.cpp:1:
In file included from /home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:20:
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:141:15: error: using declaration refers into 'accessible_base::', which is not a base class of 'xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
  141 | using accessible_base::shape;
      | ^~~~~~~~~~~~~~~~~
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:142:15: error: using declaration refers into 'accessible_base::', which is not a base class of 'xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
  142 | using accessible_base::operator[];
      | ^~~~~~~~~~~~~~~~~
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:143:15: error: using declaration refers into 'accessible_base::', which is not a base class of 'xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
  143 | using accessible_base::back;
      | ^~~~~~~~~~~~~~~~~
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:144:15: error: using declaration refers into 'accessible_base::', which is not a base class of 'xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
  144 | using accessible_base::front;
      | ^~~~~~~~~~~~~~~~~
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:145:15: error: using declaration refers into 'accessible_base::', which is not a base class of 'xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
  145 | using accessible_base::in_bounds;
      | ^~~~~~~~~~~~~~~~~
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xcontainer.hpp:146:15: error: using declaration refers into 'accessible_base::', which is not a base class of 'xcontainer<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
  146 | using accessible_base::periodic;
      | ^~~~~~~~~~~~~~~~~
In file included from main.cpp:1:
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:93:52: error: no type named 'allocator_type' in 'xt::xstrided_container<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
   93 | using allocator_type = typename base_type::allocator_type;
      | ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
main.cpp:4:22: note: in instantiation of template class 'xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>' requested here
    4 |   xt::xarray<double> temp;
      |                      ^
In file included from main.cpp:1:
/home/jtramm/openmc_offload/openmc/vendor/xtensor/include/xtensor/xarray.hpp:102:54: error: no type named 'backstrides_type' in 'xt::xstrided_container<xt::xarray_container<xt::uvector<double>, xt::layout_type::row_major, xt::svector<unsigned long>>>'
  102 | using backstrides_type = typename base_type::backstrides_type;
      | ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
12 errors generated.
make: *** [Makefile:2: all] Error 1

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsXEtzo7oS_jXKRpUUSGDDwovEiaum6py7mal7z84loLE1EYgriWTmLu5vPyVhMGDnMZm8fAqXK8E8pO7v6251t8FMa74pARYovELh9RmrzVaqxXejWFGcJTL7ufgqCzC8AMxLbLaABdMGF7I0W8zKDDO8ZSLHUmEtEVniP_749594yzROlLyFEudSucuWiFwhcoV_GCi1VHgLLAOFBU8UUz8xItHWmEojeonICpHVhpttnVykskBktbvoXBuW3u4_IxJfIO8aeZfN3y94y-4AM1zwkhdMYAWVklmdgrKioZlXMF5epFWFZp6dqXet3ePeO0F3ewnlZSrqDDAipJt29YMpxX5ebKsKEdIfhpcG20kQie4kzxCJMZrvBsP4h7Gz0svmckSXmawTAYjeYANFhWh3pgJTqxJ73S40vx4J2p82lUXFBWSY6Yf02p0oWLnZUdGCgc-_ILKqmNkisjKyj--q1f7IKWJ_-BHJvhh8L9WtxjkvAd9zs8VC3BXYjy78C8_SYq2orrCR2E9nEYWEkoAB86KE5HEGZJaylMxDSjIWMS-fA7VXJbXB93sz07KA-y0owAmYe4Dy2YO5-b0wD4IgygIv97wkzhMSBHPwU0rSzI_YnMVJlHi-PzC3_1hlrG2ntVJQGpzBHQhZ4TtQmssSy9y5gxWXG7zhd6Dd-bkUQt7zcoNBKaleythWFoDIqnFWRFaygrJI1zLPhWRZtwOR1R2UWWO3x4l90UgH_H8pcc6FDRRuZ4ZzJYtOZkQv_U7T46e-kk6DfT1PpZd-_BESJHWeg1qzjFVGqp0o5EPA0EYqtoFWBvoRMjRba82LrKVlvneBt5ixNlzo3VxRPEP0klr0O-_DrEj4ppa1xhVThjOBdQUpZ4L_jxkuS21dGZG5goSX2TqVpWG8BIXoUkjrncsutOs7SI0ddVmXbm3NsDuF3tg3mbcBPopnGM2XuH3V2sYD87MCjOi12yhZAfjIlNpkzVyVURnP87WxAnx1U9jd9treUmJfdiYU3rwTxjEJEL0MLbKlNGD_8xLzUhtWGu4QtYDaJU8wAzgVTGuLbwviBsxaG8Uz0OtGm-Vz8cUK_luDNpBhuxy0IMQkcCA0MA_GH-J9ZOrlxyLbD2Ch9VjqPRtZZ09McObgHej2MFY4pEdMsw-Kg2w4Gl3qLatgh9nNHqW3B6jzjR1I1Hp4QF9ufvsR17y0f61SumeEDScDp2wP1Z19drldPzwI9lPWZoeS3aHk_bpg36V6fhB5xM7psaDS6LCnZ2jwDyp73Zn9eIAPdYGZjS2-_zrsGlAsEXA6BM-CAcFW-0f1OdTjZunKNLdkuM1vrJ33XTltZd3R6vz1t5y2U_7EfDY4Fm0f99kxz5_CSUeE-qF_sFYhEulbXlVWQx9bKuCHsTwnLL01iqVWalxrwOd5y_R5d-xc8IIbRK89WyxqsCubQCRu1fRDv0OyMY9OJucoVZ0Injp_0abzlTbSvddqNYKJulAWkFcw_FMwduofcGSFbLLv9ZAuxe-swj-OM_VOVj1OLuZ-Vz78xvIz0vcUmJsfJc7JOPauI-pdN8J-LHfEdf1o_Bq5wylQRmbemLMmYe_VkwfctSq8v6v1s7zIBkQ6_w2mDjQ9BcYiMiZsJOmArqMq_lLG94hH9vp2NuMmv7NCfSjcD9e5uE2mn9-Xf_9mShTZpNgfwH-8S4ULZtItaIzCK9do_8tljW2Hauk-jTGz5uAODKEjS_wvtztA4XXXs4r2qao2qk7NsfbUX24yRJff3CiD2uLtoRt2OP3AD18HvSdAIkt86Ta75hwTQqbsAbMkS3zVpPSqhj3CVtznIrw3-h3OVgQ38PFqrvfqGPj8HXvifYQEB4kDfdsG9bgWtjYbeoMWdSmbZp6t_zIbXLWBqgJlwxsvT6wQ7mwzCHtd2Z1GT5e6reqHYfn_D71QeLPb-NAC-NezzWGl-ok4PL6ovkYN_jH9iqkQnwrxk2BuKsSnQnwqxKdCfCrER2XNVOCcTIEzswXO7PECp0kR_xllzqxX5gz0errYGcLwkpKnX_iclEO8i-n7geeKtYExNkxlkAqmmriqIAelMS-NtFbI0hS05parhOmdnVjKyRLfb3m6xVzbII0Ztsd3obi5i-yz5i7d96iB1zPXo5oyc7wnemCDU0455ZRTTjnllFNO-Y9eQv1pCR0tof5TS6i7U-vTraK-a4BOVPapJE9RKStQ7ps-9xDdJ-SUTpyOOKVPcZqw9PYTMhlMTI6YDJ5iMley_Hzliu--5J2o7FMZPkUlL9eJrMtMf0I6ZxOdIzpnT9FZgeIy4-mvsPkL2feb59mxXVdD8ngbs7sPqMH2sI_5yWvZjpl4sGYOtBp2MS3BvYlHADyvgznmfypb37FsffvnsD3LXBg87jk2BRs8inmyvuN7_RpirNej3nMAwsv8p_UgnzSAa7yB0lYtkF20vnW7e0bnsnljFF79yW7BWo11NvegtBAovMY3dgjsH_3VgrNsQbOYxuwMFv7cD_1oPo_Ds-2CRElOvWg2Jywk3iychUkYMS9mLM7j2Tw_4wvikcALvcife9QnF7MEohmD2Kc-jcGfo8CDgnFxIcRdcSHV5oxrXcMi9kMvOBMsAaHdL5kQUsI9dgcRISi8PlMLe815Um80CjzBtdH7UQw3AhaX3UPg39qo8XV4h2hzW2hj0me1EotHfrLEDr77d14p-R1SYz3DiqQRWTmR_w4AAP__zMKEow">