summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremsr <emsr@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-05 11:38:09 +0000
committeremsr <emsr@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-05 11:38:09 +0000
commit5a0ec3b3d88d9642e832f3b66e58e7a9ebe1fbd6 (patch)
tree7a2c73f400491d230b9c7c958fd053661656865e
parentf2ba16e75ae53b744bee2e855282871e879d8df1 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/parser.c51
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C7
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" }
+};