@@ -305,3 +305,82 @@ static_assert(__is_same_as(_Three_way_comparison_result_with_tuple_like<tuple<in
305305static_assert (__is_same_as(_Three_way_comparison_result_with_tuple_like<tuple<int >, 0 >::type, long ));
306306
307307}
308+
309+ namespace GH88866 {
310+
311+ template <typename ...Ts> struct index_by ;
312+
313+ template <typename T, typename Indices>
314+ concept InitFunc = true ;
315+
316+ namespace ExpandsBoth {
317+
318+ template <typename Indices, InitFunc<Indices> auto ... init>
319+ struct LazyLitMatrix ; // expected-note {{here}}
320+
321+ template <
322+ typename ...Indices,
323+ InitFunc<index_by<Indices>> auto ... init
324+ >
325+ struct LazyLitMatrix <index_by<Indices...>, init...> {
326+ };
327+
328+ // FIXME: Explain why we didn't pick up the partial specialization - pack sizes don't match.
329+ template struct LazyLitMatrix <index_by<int , char >, 42 >;
330+ // expected-error@-1 {{instantiation of undefined template}}
331+ template struct LazyLitMatrix <index_by<int , char >, 42 , 43 >;
332+
333+ }
334+
335+ namespace ExpandsRespectively {
336+
337+ template <typename Indices, InitFunc<Indices> auto ... init>
338+ struct LazyLitMatrix ;
339+
340+ template <
341+ typename ...Indices,
342+ InitFunc<index_by<Indices...>> auto ... init
343+ >
344+ struct LazyLitMatrix <index_by<Indices...>, init...> {
345+ };
346+
347+ template struct LazyLitMatrix <index_by<int , char >, 42 >;
348+ template struct LazyLitMatrix <index_by<int , char >, 42 , 43 >;
349+
350+ }
351+
352+ namespace TypeParameter {
353+
354+ template <typename Indices, InitFunc<Indices>... init>
355+ struct LazyLitMatrix ; // expected-note {{here}}
356+
357+ template <
358+ typename ...Indices,
359+ InitFunc<index_by<Indices>>... init
360+ >
361+ struct LazyLitMatrix <index_by<Indices...>, init...> {
362+ };
363+
364+ // FIXME: Explain why we didn't pick up the partial specialization - pack sizes don't match.
365+ template struct LazyLitMatrix <index_by<int , char >, float >;
366+ // expected-error@-1 {{instantiation of undefined template}}
367+ template struct LazyLitMatrix <index_by<int , char >, unsigned , float >;
368+
369+ }
370+
371+ namespace Invalid {
372+
373+ template <typename Indices, InitFunc<Indices>... init>
374+ struct LazyLitMatrix ;
375+
376+ template <
377+ typename ...Indices,
378+ InitFunc<index_by<Indices>> init
379+ // expected-error@-1 {{unexpanded parameter pack 'Indices'}}
380+ >
381+ struct LazyLitMatrix <index_by<Indices...>, init> {
382+ };
383+
384+ }
385+
386+ }
0 commit comments