/* ??? 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;
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);
"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
--- /dev/null
+/* PR c/67964 */
+/* { dg-do compile } */
+
+extern int fn0 (void) __attribute__ ((const const)); /* { dg-error "expected" } */
+extern int fn1 (void) __attribute__ ((const, const));
+extern int fn2 (void) __attribute__ ((optimize (0) const)); /* { dg-error "expected" } */
+extern int fn3 (void) __attribute__ ((optimize (0), const));
+/* We allow starting/trailing comma. */
+extern int fn4 (void) __attribute__ ((, const));
+extern int fn5 (void) __attribute__ ((const, ));
+extern int fn6 (void) __attribute__ ((,,,, const,,,,, ));
+extern int fn7 (void) __attribute__ ((,));
+extern int fn8 (void) __attribute__ ((__noreturn__ __noreturn__)); /* { dg-error "expected" } */
+extern int fn9 (void) __attribute__ ((__noreturn__, __noreturn__));
+extern int fn10 (void) __attribute__ ((__cold__ __pure__ __noclone__)); /* { dg-error "expected" } */
+extern int fn11 (void) __attribute__ ((__cold__, __pure__ __noclone__)); /* { dg-error "expected" } */
+int i;
+int ii;
+extern int a __attribute__ ((alias ("i") unused)); /* { dg-error "expected" } */
+extern int a2 __attribute__ ((alias ("i" "i")));
+struct A { char p[6]; } __attribute__((__packed__ packed)); /* { dg-error "expected" } */