diff options
author | Marek Polacek <polacek@redhat.com> | 2015-10-20 16:53:45 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2015-10-20 16:53:45 +0000 |
commit | 2c7020eb7e9642df8a9bc39b5b28077f1b24cadb (patch) | |
tree | c8c49700d2ef453f3aba6ccf592745725642b511 /gcc/c | |
parent | 78edb32f826fbfafed3a6e8eda5f4043a5887a99 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 16 |
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 |