From 70caf430fe8b94a213f60ef7798766990da1b311 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Tue, 25 Apr 2017 16:12:58 +0000 Subject: [PATCH] parser.c (cp_parser_elaborated_type_specifier): Add fix-it to diagnostic of invalid class/struct keyword after enum. * parser.c (cp_parser_elaborated_type_specifier): Add fix-it to diagnostic of invalid class/struct keyword after enum. * g++.dg/cpp0x/enum34.C: New test. From-SVN: r247254 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/parser.c | 14 +++++++++----- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/cpp0x/enum34.C | 11 +++++++++++ 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/enum34.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9c8ad1077e4..1a9ca1942b8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-04-25 Volker Reichelt + + * parser.c (cp_parser_elaborated_type_specifier): Add fix-it to + diagnostic of invalid class/struct keyword after enum. + 2017-04-25 David Malcolm * parser.c (cp_parser_member_declaration): Add fix-it hint diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index c9780f801db..4714bc6cd89 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -17270,12 +17270,16 @@ cp_parser_elaborated_type_specifier (cp_parser* parser, tag_type = enum_type; /* Issue a warning if the `struct' or `class' key (for C++0x scoped enums) is used here. */ - if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS) - || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT)) + cp_token *token = cp_lexer_peek_token (parser->lexer); + if (cp_parser_is_keyword (token, RID_CLASS) + || cp_parser_is_keyword (token, RID_STRUCT)) { - pedwarn (input_location, 0, "elaborated-type-specifier " - "for a scoped enum must not use the %qD keyword", - cp_lexer_peek_token (parser->lexer)->u.value); + gcc_rich_location richloc (token->location); + richloc.add_range (input_location, false); + richloc.add_fixit_remove (); + pedwarn_at_rich_loc (&richloc, 0, "elaborated-type-specifier for " + "a scoped enum must not use the %qD keyword", + token->u.value); /* Consume the `struct' or `class' and parse it anyway. */ cp_lexer_consume_token (parser->lexer); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1bc68ac3a11..6b1feffebe8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-04-25 Volker Reichelt + + * g++.dg/cpp0x/enum34.C: New test. + 2017-04-25 Tom de Vries * lib/gcc-dg.exp (cleanup-after-saved-dg-test): Cleanup line number diff --git a/gcc/testsuite/g++.dg/cpp0x/enum34.C b/gcc/testsuite/g++.dg/cpp0x/enum34.C new file mode 100644 index 00000000000..6bc72de8f98 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum34.C @@ -0,0 +1,11 @@ +// { dg-options "-fdiagnostics-show-caret" } +// { dg-do compile { target c++11 } } + +enum class E; + +enum class E e; /* { dg-warning "scoped enum must not use" } + { dg-begin-multiline-output "" } + enum class E e; + ~~~~ ^~~~~ + ----- + { dg-end-multiline-output "" } */ -- 2.30.2