A related example: template <class T, void (*P)(T)> void f(T) {} template <class T> void g(T) {} int main() { f<int, g<int> >(42); } Here EDG uses T_ in the parameters of both f and g, i.e. _Z1fIiXadL_Z1gIiEvT_EEEvT_ whereas gcc and clang use a substitution for the parameter of f, _Z1fIiXadL_Z1gIiEvT_EEEvS1_ Jason