Other compilers accept invalid code here that we reject, and we need a
better error message to try to convince users that the code is really
incorrect. Consider:
class Foo { typedef MyIterHelper<Foo> iterator; friend class iterator; };
Previously our wording was "elaborated type refers to a typedef".
"elaborated type" isn't widely known terminology, so the new diagnostic
tries to talk about tag types.
"tag" is C terminology that C++ doesn't share; "specifier" would be correct in both languages.
Also, this wording suggests that *some* templates / template template arguments / ... can be referenced by, say, a struct specifier. How about:
(where we use "non-enum type" when the tag is enum, "non-union type" when the tag is union, and otherwise use "non-struct type" in C and "non-class type" in C++)?