As per GCC's C grammar, the init-declarator rule has the following production:
init-declarator: declarator simple-asm-expr[opt] gnu-attributes[opt] declarator simple-asm-expr[opt] gnu-attributes[opt] = initializer Due to conflicts in Coccinelle's C grammar, adding productions with attributes to init_declarator is not possible. Create init_declarator_attrs and use this rule in init_declarator_list for handling attributes after commas. Following is an example of C code that is parsed successfully: struct mxser_mstatus ms, __user *msu = argp; Signed-off-by: Jaskaran Singh <jaskaransingh7654...@gmail.com> --- parsing_c/parser_c.mly | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly index a5b0d214..1ff2fd87 100644 --- a/parsing_c/parser_c.mly +++ b/parsing_c/parser_c.mly @@ -1668,6 +1668,23 @@ init_declarator2: | declaratori TOParCplusplusInit argument_list TCPar { ($1, ConstrInit($3,[$2;$4])) } +/*(*-----------------------------------------------------------------------*)*/ +/*(* declarators (right part of type and variable). *)*/ +/*(* This is a workaround for the following case: *)*/ +/*(* <type> <declarator>, <attribute> <declarator> ...*)*/ +/*(* The normal init_declarator rule does not handle this, and adding *)*/ +/*(* attributes to it causes conflicts, thus the need for this rule. *)*/ +/*(*-----------------------------------------------------------------------*)*/ +init_declarator_attrs2: + | declaratori { ($1, NoInit) } + | attributes declaratori { ($2, NoInit) } + | declaratori teq initialize { ($1, ValInit($2, $3)) } + | attributes declaratori teq initialize { ($2, ValInit($3, $4)) } + /* C++ only */ + | declaratori TOParCplusplusInit argument_list TCPar + { ($1, ConstrInit($3,[$2;$4])) } + | attributes declaratori TOParCplusplusInit argument_list TCPar + { ($2, ConstrInit($4,[$3;$5])) } /*(*----------------------------*)*/ /*(* workarounds *)*/ @@ -1676,6 +1693,8 @@ teq: TEq { et "teq" (); $1 } init_declarator: init_declarator2 { dt "init" (); $1 } +init_declarator_attrs: init_declarator_attrs2 { dt "init_attrs" (); $1 } + /*(*----------------------------*)*/ /*(* gccext: *)*/ @@ -2373,9 +2392,9 @@ enumerator_list: init_declarator_list: | init_declarator { [$1, []] } - | init_declarator_list TComma cpp_directive_list init_declarator + | init_declarator_list TComma cpp_directive_list init_declarator_attrs { $1 @ [$4, [$2]] } - | init_declarator_list TComma init_declarator { $1 @ [$3, [$2]] } + | init_declarator_list TComma init_declarator_attrs { $1 @ [$3, [$2]] } parameter_list: -- 2.21.1 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci