[Linux-kernel-mentees] [PATCH 01/32] parsing_c: parser: Pass attribute list from type_name
Jaskaran Singh
jaskaransingh7654321 at gmail.com
Tue Apr 28 17:01:57 UTC 2020
To add Cast attributes to the C AST, pass attributes from the type_name
rule of the C parser.
Signed-off-by: Jaskaran Singh <jaskaransingh7654321 at gmail.com>
---
ocaml/coccilib.mli | 3 ++-
parsing_c/parse_c.ml | 4 +++-
parsing_c/parser_c.mly | 16 ++++++++--------
3 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/ocaml/coccilib.mli b/ocaml/coccilib.mli
index 0e807c9a..a305d616 100644
--- a/ocaml/coccilib.mli
+++ b/ocaml/coccilib.mli
@@ -791,7 +791,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 0d3a189a..5f8d5e2d 100644
--- a/parsing_c/parse_c.ml
+++ b/parsing_c/parse_c.ml
@@ -370,7 +370,9 @@ let parse_gen ~cpp ~tos parsefunc 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
+let type_of_string s =
+ let typname = parse_gen ~cpp:false ~tos:true Parser_c.type_name s in
+ Common.snd typname
let statement_of_string = parse_gen ~cpp:false ~tos:false Parser_c.statement
let expression_of_string = parse_gen ~cpp:false ~tos:false Parser_c.expr
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 aedde179..0abcc9b0 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,7 @@ 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 { mk_e(SizeOfType (snd $3)) [$1;$2;$4] }
| 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 +897,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 +1298,7 @@ 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 { Right3 (TypeOfType (snd $3)), [$1;$2;$4] }
/*(*----------------------------*)*/
/*(* workarounds *)*/
@@ -1531,12 +1531,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 at attrs2, fn returnType) }
--
2.21.1
More information about the Linux-kernel-mentees
mailing list