From 6bd6462425aa83c63a3becabaeaa247f9cd544cf Mon Sep 17 00:00:00 2001 From: Virgile Prevosto <virgile.prevosto@m4x.org> Date: Thu, 14 Mar 2019 15:23:20 +0100 Subject: [PATCH] [parsing] Allow attributes in declarator lists Previously, the parser only allowed attributes at beginning of a declaration (like for `const`, `static`, ...). However, gcc accepts to have attributes in the rest of the declaration (after the first comma, like for a pointer or array declarator). Fixes #616 --- src/kernel_internals/parsing/cparser.mly | 15 ++++++++++++++- .../syntax/attributes-declarations-definitions.c | 4 ++++ ...attributes-declarations-definitions.res.oracle | 7 +++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/kernel_internals/parsing/cparser.mly b/src/kernel_internals/parsing/cparser.mly index 7da75c2c4a1..29da754e5d2 100644 --- a/src/kernel_internals/parsing/cparser.mly +++ b/src/kernel_internals/parsing/cparser.mly @@ -1035,9 +1035,22 @@ declaration: /* ISO 6.7.*/ 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 } ; + +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 */ declarator { ($1, NO_INIT) } | declarator EQ init_expression diff --git a/tests/syntax/attributes-declarations-definitions.c b/tests/syntax/attributes-declarations-definitions.c index f090ff912c4..82a09705250 100644 --- a/tests/syntax/attributes-declarations-definitions.c +++ b/tests/syntax/attributes-declarations-definitions.c @@ -41,3 +41,7 @@ iptr h(volatile iptr ip2) { } iptr volatile h(const iptr ip3); + +void test(void) { + int a, __attribute__((unused)) b; +} diff --git a/tests/syntax/oracle/attributes-declarations-definitions.res.oracle b/tests/syntax/oracle/attributes-declarations-definitions.res.oracle index 89fcae3ec66..57fdf7c1995 100644 --- a/tests/syntax/oracle/attributes-declarations-definitions.res.oracle +++ b/tests/syntax/oracle/attributes-declarations-definitions.res.oracle @@ -42,4 +42,11 @@ iptr h(iptr volatile ip3) return __retres; } +void test(void) +{ + int a; + int b __attribute__((__unused__)); + return; +} + -- GitLab