https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110809
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Ed Catmur from comment #5) > The original code is valid. A reduced valid case would be: > ``` > template <double> struct S {}; > template <typename Hash, int i> struct bucket {}; > template <typename Hash, int i> > int find_indices_impl(bucket<Hash, i> const &); > struct HashTable : bucket<S<1.>, 1>, bucket<S<2.>, 2> {}; > auto t = find_indices_impl<S<1.>>(HashTable{}); > ``` Oh yes and yes the above looks like the original code even. It is definitely trying to match bucket<S<2.>, 2> base class with bucket<S<1.>, i> though and it is ICEing there.