diff --git a/src/frontc/cparser.mly b/src/frontc/cparser.mly index db28c7079..7ae65a9b0 100644 --- a/src/frontc/cparser.mly +++ b/src/frontc/cparser.mly @@ -956,7 +956,22 @@ static_assert_declaration: ; init_declarator_list: /* ISO 6.7 */ init_declarator { [$1] } -| init_declarator COMMA init_declarator_list { $1 :: $3 } +| init_declarator COMMA init_declarator_attr_list { $1 :: $3 } + /* Here we disallow attributes for the declarator. Attributes appearing there are parsed as if they belong to the type. */ + /* See also https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html */ +; + +init_declarator_attr_list: + init_declarator_attr { [ $1 ] } +| init_declarator_attr COMMA init_declarator_attr_list { $1 :: $3 } +; + +init_declarator_attr: + attribute_nocv_list init_declarator { + let ((name, decl, attrs, loc), init) = $2 in + ((name, PARENTYPE ($1,decl,[]), attrs, loc), init) + } +; ; init_declarator: /* ISO 6.7 */ diff --git a/test/small1/attr-in-decllist.c b/test/small1/attr-in-decllist.c new file mode 100644 index 000000000..da0dff3ca --- /dev/null +++ b/test/small1/attr-in-decllist.c @@ -0,0 +1,8 @@ +int __attribute__((unused))version,j; +int i, ret, __attribute__((unused))version2, nb_curves; +int i2, ret2, __attribute__((unused))(version3), nb_curves2; +int i3, ret3, (__attribute__((unused))version4), nb_curves3; + +int main(void) { + return 0; +} diff --git a/test/testcil.pl b/test/testcil.pl index 1087c132e..047b868f0 100644 --- a/test/testcil.pl +++ b/test/testcil.pl @@ -208,6 +208,8 @@ sub addToGroup { addTest("testrun/percent400"); addTest("testrun/caserange _GNUCC=1"); +addTest("testrun/attr-in-decllist"); + addTest("test/attr2 _GNUCC=1"); addTest("test/attr3 _GNUCC=1"); addTest("testrun/attr4 _GNUCC=1");