https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109531
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Slightly cleaned up: template <class> using A = int *; template <class T, template <class> class U> struct B { typedef U <typename T::type> type; }; struct C { typedef int *type; }; template <class T> struct D { D <C> foo () { return D <C> (); } template <template <class> class U> U <typename T::type> bar (); }; struct E { typedef int type; }; D <B <E, A>> d; As no floating point types are involved, I think this had to be latent before.