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