On 01/22/2014 10:10 PM, Jason Merrill wrote:
Yep, that's along the lines I was thinking of. But again, prev_scope is
irrelevant here, so the new code shouldn't mention it at all.
Well, in practice I have to mention it in the error_at itself. Otherwise
I'm finishing testing the below.
Paolo.
//////////////////////////
Index: cp/parser.c
===================================================================
--- cp/parser.c (revision 206933)
+++ cp/parser.c (working copy)
@@ -15469,9 +15469,17 @@ cp_parser_enum_specifier (cp_parser* parser)
error_at (type_start_token->location, "cannot add an enumerator "
"list to a template instantiation");
+ if (TREE_CODE (nested_name_specifier) == TYPENAME_TYPE)
+ {
+ error_at (type_start_token->location,
+ "%<%E::%E%> has not been declared",
+ prev_scope, nested_name_specifier);
+ type = error_mark_node;
+ }
/* If that scope does not contain the scope in which the
class was originally declared, the program is invalid. */
- if (prev_scope && !is_ancestor (prev_scope, nested_name_specifier))
+ else if (prev_scope && !is_ancestor (prev_scope,
+ nested_name_specifier))
{
if (at_namespace_scope_p ())
error_at (type_start_token->location,
@@ -15480,7 +15488,8 @@ cp_parser_enum_specifier (cp_parser* parser)
type, prev_scope, nested_name_specifier);
else
error_at (type_start_token->location,
- "declaration of %qD in %qD which does not enclose
%qD",
+ "declaration of %qD in %qD which does not "
+ "enclose %qD",
type, prev_scope, nested_name_specifier);
type = error_mark_node;
}
Index: testsuite/g++.dg/parse/enum11.C
===================================================================
--- testsuite/g++.dg/parse/enum11.C (revision 0)
+++ testsuite/g++.dg/parse/enum11.C (working copy)
@@ -0,0 +1,6 @@
+// PR c++/58980
+
+template<typename> struct A
+{
+ enum A::B::C {}; // { dg-error "has not been declared" }
+};