Commit f523e68a by Paolo Carlini Committed by Paolo Carlini

re PR c++/66781 ("confused by earlier errors, bailing out" with wrong enum within class)

/cp
2015-10-21  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/66781
	* parser.c (cp_parser_enum_specifier): Upon error_at set
	nested_name_specifier to error_mark_node; improve error message.

/testsuite
2015-10-21  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/66781
	* g++.dg/parse/enum13.C: New.

/cp
2015-10-21  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/67847
	* parser.c (cp_parser_enum_specifier): Reject a nested_name_specifier
	which doesn't name a class or namespace.

/testsuite
2015-10-21  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/67847
	* g++.dg/parse/enum12.C: New.

From-SVN: r229156
parent a7b2e184
2015-10-21 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/66781
* parser.c (cp_parser_enum_specifier): Upon error_at set
nested_name_specifier to error_mark_node; improve error message.
2015-10-21 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67847
* parser.c (cp_parser_enum_specifier): Reject a nested_name_specifier
which doesn't name a class or namespace.
2015-10-21 Ilya Enkovich <enkovich.gnu@gmail.com>
* call.c (build_conditional_expr_1): Use boolean vector
......
......@@ -16655,8 +16655,12 @@ cp_parser_enum_specifier (cp_parser* parser)
else if (nested_name_specifier == error_mark_node)
/* We already issued an error. */;
else
error_at (type_start_token->location,
"%qD is not an enumerator-name", identifier);
{
error_at (type_start_token->location,
"%qD does not name an enumeration in %qT",
identifier, nested_name_specifier);
nested_name_specifier = error_mark_node;
}
}
else
{
......@@ -16783,6 +16787,14 @@ cp_parser_enum_specifier (cp_parser* parser)
nested_name_specifier);
type = error_mark_node;
}
else if (TREE_CODE (nested_name_specifier) != NAMESPACE_DECL
&& !CLASS_TYPE_P (nested_name_specifier))
{
error_at (type_start_token->location, "nested name specifier "
"%qT for enum declaration does not name a class "
"or namespace", 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. */
else if (prev_scope && !is_ancestor (prev_scope,
2015-10-21 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/66781
* g++.dg/parse/enum13.C: New.
2015-10-21 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67847
* g++.dg/parse/enum12.C: New.
2015-10-21 Martin Sebor <msebor@redhat.com>
PR driver/68043
......
// PR c++/67847
template < typename T >
class D
{
enum T::Color {R, G, B} c; // { dg-error "nested name specifier" }
};
// PR c++/66781
class foo
{
public:
enum foo::bar{}; // { dg-error "does not name an enumeration" }
foo::bar baz;
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment