diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2015-10-21 22:52:45 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2015-10-21 22:52:45 +0000 |
commit | f523e68a231849653c829aab6b0ccaf99137d0a5 (patch) | |
tree | 90b066e13d411947432f609dd047e25734cbe64a /gcc | |
parent | a7b2e1845f0c20da4ed6462161f58f706a587d44 (diff) | |
download | gcc-f523e68a231849653c829aab6b0ccaf99137d0a5.zip gcc-f523e68a231849653c829aab6b0ccaf99137d0a5.tar.gz gcc-f523e68a231849653c829aab6b0ccaf99137d0a5.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/parser.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/enum12.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/enum13.C | 8 |
5 files changed, 51 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2a9e873..0ed4e29 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +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 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index cfe5468..7555bf3 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1c31c22..ef63b1b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +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 diff --git a/gcc/testsuite/g++.dg/parse/enum12.C b/gcc/testsuite/g++.dg/parse/enum12.C new file mode 100644 index 0000000..835dacd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum12.C @@ -0,0 +1,7 @@ +// PR c++/67847 + +template < typename T > +class D +{ + enum T::Color {R, G, B} c; // { dg-error "nested name specifier" } +}; diff --git a/gcc/testsuite/g++.dg/parse/enum13.C b/gcc/testsuite/g++.dg/parse/enum13.C new file mode 100644 index 0000000..102f219 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum13.C @@ -0,0 +1,8 @@ +// PR c++/66781 + +class foo +{ +public: + enum foo::bar{}; // { dg-error "does not name an enumeration" } + foo::bar baz; +}; |