Consider this testcase: $cat genpreds1_min.cc template <typename> class A; template <int> struct B; template <typename> struct C; template <> template <int N> struct C <B <N> > { template<typename T> A <B <N> > m_fn(T); }; template <int N> template <typename T> A <B <N> > C <B <N> >::m_fn (T) { } EDG rejects it with the following error: /opt/intel/bin/icpc -c genpreds1_min.cc genpreds1_min.cc(22): error: incomplete type is not allowed C <B <N> >::m_fn (T) ^ genpreds1_min.cc(22): error: template argument list must match the parameter list C <B <N> >::m_fn (T) ^ compilation aborted for genpreds1_min.cc (code 2) Clang gives warning: /opt/clang-trunk/bin/clang++ -c genpreds1_min.cc genpreds1_min.cc:10:1: warning: extraneous template parameter list in template specialization template <> ^~~~~~~~~~~ 1 warning generated. But GCC silently accepts this code. I suppose that GCC could warn about: template <typename> struct base {}; template <typename> struct s {}; template <> template <typename T> struct base <s <T> > {}; like Clang does (note: in this case EDG accepts the code without warnings/errors).
dup *** This bug has been marked as a duplicate of bug 63809 ***