Hi there, I find a clang warning is suspicious. Consider this code:
template <typename T1> struct A {
template <typename T2> struct B {
template <typename T3> struct C {
static void foo();
};
};
};
template <> struct A<int> {
template <typename T2> struct B {
template <typename T3> struct C {
static void foo();
};
};
};
template <> template <typename T3> struct A<int>::B<int>::C {
static void foo();
};
Clang would emit a warning like "extraneous template parameter list in template
specialization" at
template <> template <typename T3> struct A<int>::B<int>::C. I think the code
should not trigger a warning here since the first template <> is applied to the
explicit specialization of the nested class template B, not to A as indicated
by the "note" of clang diagnostic (since A has already had a declaration of an
explicit specialization so the template <> for A could be omitted)
After looking at the code, it looks like the problem is in SemaTemplate.cpp
when iterating the nested types, the loop is terminated before it should be so
the template header is never consumed. The attached patch fixes this, with a
test added.
Please review, thanks!
Cheers
~Michael
exp.spec.patch
Description: exp.spec.patch
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
