diff options
author | emsr <emsr@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-04-05 11:38:09 +0000 |
---|---|---|
committer | emsr <emsr@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-04-05 11:38:09 +0000 |
commit | 5a0ec3b3d88d9642e832f3b66e58e7a9ebe1fbd6 (patch) | |
tree | 7a2c73f400491d230b9c7c958fd053661656865e | |
parent | f2ba16e75ae53b744bee2e855282871e879d8df1 (diff) | |
download | gcc-5a0ec3b3d88d9642e832f3b66e58e7a9ebe1fbd6.tar.gz |
There can be only one ref qualifier at most.
gcc/cp:
2013-04-05 Ed Smith-Rowland <3dw4rd@verizon.net>
* g++.dg/cpp0x/ref-qual-multi-neg.C: New test.
gcc/testsuite:
2013-04-05 Ed Smith-Rowland <3dw4rd@verizon.net>
* parser.c (cp_parser_ref_qualifier_seq_opt): Move to
cp_parser_ref_qualifier_opt. Error if more than one ref-qual found.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@197514 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/parser.c | 51 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C | 7 |
4 files changed, 52 insertions, 15 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d039f8bdaf3..dc676103302 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-04-05 Ed Smith-Rowland <3dw4rd@verizon.net> + + * parser.c (cp_parser_ref_qualifier_seq_opt): Move to + cp_parser_ref_qualifier_opt. Error if more than one ref-qual found. + 2013-04-03 Jason Merrill <jason@redhat.com> * cp-tree.h (FUNCTION_OR_METHOD_TYPE_CHECK): Remove. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 05c03f45d27..ed8eac8cc4e 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2020,7 +2020,7 @@ static cp_cv_quals cp_parser_cv_qualifier_seq_opt (cp_parser *); static cp_virt_specifiers cp_parser_virt_specifier_seq_opt (cp_parser *); -static cp_ref_qualifier cp_parser_ref_qualifier_seq_opt +static cp_ref_qualifier cp_parser_ref_qualifier_opt (cp_parser *); static tree cp_parser_late_return_type_opt (cp_parser *, cp_cv_quals); @@ -16463,7 +16463,7 @@ cp_parser_direct_declarator (cp_parser* parser, /* Parse the cv-qualifier-seq. */ cv_quals = cp_parser_cv_qualifier_seq_opt (parser); /* Parse the ref-qualifier. */ - ref_qual = cp_parser_ref_qualifier_seq_opt (parser); + ref_qual = cp_parser_ref_qualifier_opt (parser); /* And the exception-specification. */ exception_specification = cp_parser_exception_specification_opt (parser); @@ -17031,25 +17031,46 @@ cp_parser_cv_qualifier_seq_opt (cp_parser* parser) Returns cp_ref_qualifier representing ref-qualifier. */ static cp_ref_qualifier -cp_parser_ref_qualifier_seq_opt (cp_parser* parser) +cp_parser_ref_qualifier_opt (cp_parser* parser) { cp_ref_qualifier ref_qual = REF_QUAL_NONE; - cp_token *token = cp_lexer_peek_token (parser->lexer); - switch (token->type) + + while (true) { - case CPP_AND: - ref_qual = REF_QUAL_LVALUE; - break; - case CPP_AND_AND: - ref_qual = REF_QUAL_RVALUE; - break; + cp_ref_qualifier curr_ref_qual = REF_QUAL_NONE; + cp_token *token = cp_lexer_peek_token (parser->lexer); + + switch (token->type) + { + case CPP_AND: + curr_ref_qual = REF_QUAL_LVALUE; + break; + + case CPP_AND_AND: + curr_ref_qual = REF_QUAL_RVALUE; + break; + + default: + curr_ref_qual = REF_QUAL_NONE; + break; + } + + if (!curr_ref_qual) + break; + else if (ref_qual) + { + error_at (token->location, "multiple ref-qualifiers"); + cp_lexer_purge_token (parser->lexer); + } + else + { + ref_qual = curr_ref_qual; + cp_lexer_consume_token (parser->lexer); + } } if (ref_qual) - { - maybe_warn_cpp0x (CPP0X_REF_QUALIFIER); - cp_lexer_consume_token (parser->lexer); - } + maybe_warn_cpp0x (CPP0X_REF_QUALIFIER); return ref_qual; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 175977573e4..e63b313c52e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-04-05 Ed Smith-Rowland <3dw4rd@verizon.net> + + * g++.dg/cpp0x/ref-qual-multi-neg.C: New test. + 2013-04-04 Janus Weil <janus@gcc.gnu.org> PR fortran/40881 diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C new file mode 100644 index 00000000000..5be89423f03 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C @@ -0,0 +1,7 @@ +// { dg-require-effective-target c++11 } + +class Foo +{ +public: + void bar() const && & { } // { dg-error "multiple ref-qualifiers" } +}; |