aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2004-01-30 17:01:29 +0000
committerMichael Matz <matz@gcc.gnu.org>2004-01-30 17:01:29 +0000
commit98ce043beda605c6125c1b1289fb83d91cbf8407 (patch)
tree422c5bb7a187475a33ddf6acc0f5702d4437456d
parentd0acf599c8d6c56929f309ecc5761ce1bf57fa57 (diff)
downloadgcc-98ce043beda605c6125c1b1289fb83d91cbf8407.zip
gcc-98ce043beda605c6125c1b1289fb83d91cbf8407.tar.gz
gcc-98ce043beda605c6125c1b1289fb83d91cbf8407.tar.bz2
* parser.c (cp_parser_labeled_statement): Accept case ranges.
From-SVN: r76972
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/parser.c28
2 files changed, 29 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 26810de..41bc855 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,7 @@
+2004-01-30 Michael Matz <matz@suse.de>
+
+ * parser.c (cp_parser_labeled_statement): Accept case ranges.
+
2004-01-30 Giovanni Bajo <giovannibajo@gcc.gnu.org>
DR206
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 4964819..77f703f 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -5472,7 +5472,12 @@ cp_parser_statement (cp_parser* parser, bool in_statement_expr_p)
labeled-statement:
identifier : statement
case constant-expression : statement
- default : statement
+ default : statement
+
+ GNU Extension:
+
+ labeled-statement:
+ case constant-expression ... constant-expression : statement
Returns the new CASE_LABEL, for a `case' or `default' label. For
an ordinary label, returns a LABEL_STMT. */
@@ -5496,7 +5501,8 @@ cp_parser_labeled_statement (cp_parser* parser, bool in_statement_expr_p)
{
case RID_CASE:
{
- tree expr;
+ tree expr, expr_hi;
+ cp_token *ellipsis;
/* Consume the `case' token. */
cp_lexer_consume_token (parser->lexer);
@@ -5504,10 +5510,26 @@ cp_parser_labeled_statement (cp_parser* parser, bool in_statement_expr_p)
expr = cp_parser_constant_expression (parser,
/*allow_non_constant_p=*/false,
NULL);
+
+ ellipsis = cp_lexer_peek_token (parser->lexer);
+ if (ellipsis->type == CPP_ELLIPSIS)
+ {
+ /* Consume the `...' token. */
+ cp_lexer_consume_token (parser->lexer);
+ expr_hi =
+ cp_parser_constant_expression (parser,
+ /*allow_non_constant_p=*/false,
+ NULL);
+ /* We don't need to emit warnings here, as the common code
+ will do this for us. */
+ }
+ else
+ expr_hi = NULL_TREE;
+
if (!parser->in_switch_statement_p)
error ("case label `%E' not within a switch statement", expr);
else
- statement = finish_case_label (expr, NULL_TREE);
+ statement = finish_case_label (expr, expr_hi);
}
break;