https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83529
--- Comment #5 from Nathan Sidwell <nathan at gcc dot gnu.org> --- template <typename T> int Foo (T); template <int> class TPL; template <int I> constexpr TPL<Foo (I)> Foo (); // #1 template <int I> constexpr TPL<Foo (I)> Foo (); // #2 What I think is happening is that the definition at #1 changes the overload set to which 'Foo' binds. Thus in #2 the 'Foo (I)' finds something different. I don't think we prune the overload set until later?