aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2015-10-20 16:53:45 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2015-10-20 16:53:45 +0000
commit2c7020eb7e9642df8a9bc39b5b28077f1b24cadb (patch)
treec8c49700d2ef453f3aba6ccf592745725642b511 /gcc/c
parent78edb32f826fbfafed3a6e8eda5f4043a5887a99 (diff)
downloadgcc-2c7020eb7e9642df8a9bc39b5b28077f1b24cadb.zip
gcc-2c7020eb7e9642df8a9bc39b5b28077f1b24cadb.tar.gz
gcc-2c7020eb7e9642df8a9bc39b5b28077f1b24cadb.tar.bz2
re PR c/67964 (Multiple attributes wrongly accepted without commas)
PR c/67964 * c-parser.c (c_parser_attributes): Break out of the loop if the token after an attribute isn't a comma. * gcc.dg/pr67964.c: New test. From-SVN: r229091
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-parser.c16
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index a54921a..2a083c4 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,9 @@
+2015-10-20 Marek Polacek <polacek@redhat.com>
+
+ PR c/67964
+ * c-parser.c (c_parser_attributes): Break out of the loop if the
+ token after an attribute isn't a comma.
+
2015-10-13 Jakub Jelinek <jakub@redhat.com>
Aldy Hernandez <aldyh@redhat.com>
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 704ebc6..e7b8440 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -3965,7 +3965,9 @@ c_parser_attributes (c_parser *parser)
/* ??? Follow the C++ parser rather than using the
lex_untranslated_string kludge. */
parser->lex_untranslated_string = true;
+ /* Consume the `__attribute__' keyword. */
c_parser_consume_token (parser);
+ /* Look for the two `(' tokens. */
if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
{
parser->lex_untranslated_string = false;
@@ -3993,17 +3995,24 @@ c_parser_attributes (c_parser *parser)
attr_name = c_parser_attribute_any_word (parser);
if (attr_name == NULL)
break;
- if (is_cilkplus_vector_p (attr_name))
+ if (is_cilkplus_vector_p (attr_name))
{
c_token *v_token = c_parser_peek_token (parser);
c_parser_cilk_simd_fn_vector_attrs (parser, *v_token);
+ /* If the next token isn't a comma, we're done. */
+ if (!c_parser_next_token_is (parser, CPP_COMMA))
+ break;
continue;
}
c_parser_consume_token (parser);
if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
{
attr = build_tree_list (attr_name, NULL_TREE);
+ /* Add this attribute to the list. */
attrs = chainon (attrs, attr);
+ /* If the next token isn't a comma, we're done. */
+ if (!c_parser_next_token_is (parser, CPP_COMMA))
+ break;
continue;
}
c_parser_consume_token (parser);
@@ -4062,8 +4071,13 @@ c_parser_attributes (c_parser *parser)
"expected %<)%>");
return attrs;
}
+ /* Add this attribute to the list. */
attrs = chainon (attrs, attr);
+ /* If the next token isn't a comma, we're done. */
+ if (!c_parser_next_token_is (parser, CPP_COMMA))
+ break;
}
+ /* Look for the two `)' tokens. */
if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
c_parser_consume_token (parser);
else