Core issue 996: template<typename T, typename U> struct Outer { template<typename X, typename Y> struct Inner; template<typename Y> struct Inner<T, Y> {}; template<typename Y> struct Inner<U, Y> {}; }; Outer<int, int> outer; // #1 Here the instantiation of Outer<int, int> is ill-formed, because the two partial specializations of Inner have the same arguments, but we don't currently give an error.