To add Cast attributes to the C AST, pass attributes from the type_name rule of the C parser.
Signed-off-by: Jaskaran Singh <[email protected]> --- ocaml/coccilib.mli | 3 ++- parsing_c/parse_c.ml | 4 +++- parsing_c/parser_c.mly | 24 ++++++++++++++++-------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/ocaml/coccilib.mli b/ocaml/coccilib.mli index 747cc9ce..30cb1a08 100644 --- a/ocaml/coccilib.mli +++ b/ocaml/coccilib.mli @@ -792,7 +792,8 @@ module Parser_c : (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Ast_c.statement val expr : (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Ast_c.expression val type_name : - (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Ast_c.fullType + (Lexing.lexbuf -> token) -> Lexing.lexbuf -> + Ast_c.attribute list * Ast_c.fullType end module Lexer_c : sig diff --git a/parsing_c/parse_c.ml b/parsing_c/parse_c.ml index ef4482f5..5574cb11 100644 --- a/parsing_c/parse_c.ml +++ b/parsing_c/parse_c.ml @@ -374,7 +374,9 @@ let parse_gen ~cpp ~tos parsefunc infos s = result (* Please DO NOT remove this code, even though most of it is not used *) -let type_of_string = parse_gen ~cpp:false ~tos:true Parser_c.type_name None +let type_of_string s = + let typname = parse_gen ~cpp:false ~tos:true Parser_c.type_name None s in + Common.snd typname let statement_of_string = parse_gen ~cpp:false ~tos:false Parser_c.statement None let expression_of_string = parse_gen ~cpp:false ~tos:false Parser_c.expr None let cpp_expression_of_string = parse_gen ~cpp:true ~tos:false Parser_c.expr diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly index b7e74506..1630ed77 100644 --- a/parsing_c/parser_c.mly +++ b/parsing_c/parser_c.mly @@ -665,7 +665,7 @@ let postfakeInfo pii = %type <Ast_c.statement> statement %type <Ast_c.expression> expr -%type <Ast_c.fullType> type_name +%type <Ast_c.attribute list * Ast_c.fullType> type_name %% /*(*************************************************************************)*/ @@ -818,7 +818,7 @@ arith_expr: cast_expr: | unary_expr { $1 } - | topar2 type_name tcpar2 cast_expr { mk_e(Cast ($2, $4)) [$1;$3] } + | topar2 type_name tcpar2 cast_expr { mk_e(Cast (snd $2, $4)) [$1;$3] } /* It could be useful to have the following, but there is no place for the attribute in the AST. @@ -831,7 +831,11 @@ unary_expr: | TDec unary_expr { mk_e(Infix ($2, Dec)) [$1] } | unary_op cast_expr { mk_e(Unary ($2, fst $1)) [snd $1] } | Tsizeof unary_expr { mk_e(SizeOfExpr ($2)) [$1] } - | Tsizeof topar2 type_name tcpar2 { mk_e(SizeOfType ($3)) [$1;$2;$4] } + | Tsizeof topar2 type_name tcpar2 + { let ret = mk_e(SizeOfType (snd $3)) [$1;$2;$4] in + match (fst $3) with (* warn about dropped attributes *) + [] -> ret + | _ -> warning "attributes found in sizeof(...), dropping" ret } | Tnew new_argument { mk_e(New (None, $2)) [$1] } | Tnew TOPar argument_list_ne TCPar new_argument { mk_e(New (Some $3, $5)) [$1; $2; $4] } | Tdelete cast_expr { mk_e(Delete(false, $2)) [$1] } @@ -897,9 +901,9 @@ postfix_expr: /*(* gccext: also called compound literals *)*/ | topar2 type_name tcpar2 TOBrace TCBrace - { mk_e(Constructor ($2, (InitList [], [$4;$5]))) [$1;$3] } + { mk_e(Constructor (snd $2, (InitList [], [$4;$5]))) [$1;$3] } | topar2 type_name tcpar2 TOBrace initialize_list gcc_comma_opt_struct TCBrace - { mk_e(Constructor ($2, (InitList (List.rev $5),[$4;$7] @ $6))) [$1;$3] } + { mk_e(Constructor (snd $2, (InitList (List.rev $5),[$4;$7] @ $6))) [$1;$3] } primary_expr: @@ -1298,7 +1302,11 @@ type_spec2: Right3 (TypeName (name, Ast_c.noTypedefDef())),[] } | Ttypeof TOPar assign_expr TCPar { Right3 (TypeOfExpr ($3)), [$1;$2;$4] } - | Ttypeof TOPar type_name TCPar { Right3 (TypeOfType ($3)), [$1;$2;$4] } + | Ttypeof TOPar type_name TCPar + { let ret = Right3 (TypeOfType (snd $3)), [$1;$2;$4] in + match (fst $3) with (* warn about dropped attributes *) + [] -> ret + | _ -> warning "attributes found in typeof(...), dropping" ret } /*(*----------------------------*)*/ /*(* workarounds *)*/ @@ -1532,12 +1540,12 @@ type_qualif_list: type_name: | spec_qualif_list { let (attrs, ds) = $1 in - let (returnType, _) = fixDeclSpecForDecl ds in returnType } + let (returnType, _) = fixDeclSpecForDecl ds in (attrs, returnType) } | spec_qualif_list abstract_declaratort { let (attrs1, ds) = $1 in let (attrs2, fn) = $2 in let (returnType, _) = fixDeclSpecForDecl ds in - fn returnType } + (attrs1@attrs2, fn returnType) } -- 2.21.1 _______________________________________________ Cocci mailing list [email protected] https://systeme.lip6.fr/mailman/listinfo/cocci
