aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cparser/Checks.ml81
-rw-r--r--cparser/Elab.ml1
-rw-r--r--cparser/Parse.ml4
3 files changed, 55 insertions, 31 deletions
diff --git a/cparser/Checks.ml b/cparser/Checks.ml
index dc08e254..76bd095c 100644
--- a/cparser/Checks.ml
+++ b/cparser/Checks.ml
@@ -78,6 +78,7 @@ let unknown_attrs_program p =
List.iter (unknown_attrs_decl env g.gloc) f.fd_locals;
Env.add_ident env f.fd_name f.fd_storage (fundef_typ f)
| Gcompositedecl(su, id, attr) ->
+ unknown_attrs g.gloc attr;
Env.add_composite env id (composite_info_decl su attr)
| Gcompositedef(su, id, attr, fl) ->
unknown_attrs g.gloc attr;
@@ -121,53 +122,77 @@ and vars_used_init env = function
| Init_struct (_,sl) -> List.fold_left (fun env (_,i) -> vars_used_init env i) env sl
| Init_union (_,_,ui) -> vars_used_init env ui
-let rec vars_used_stmt ((dec_env,used_env) as acc) s =
+let rec vars_used_stmt env s =
match s.sdesc with
| Sbreak
| Scontinue
| Sgoto _
| Sreturn None
- | Sskip -> acc
+ | Sskip -> env
| Sreturn (Some e)
- | Sdo e -> dec_env,(vars_used_expr used_env e)
+ | Sdo e -> (vars_used_expr env e)
| Sseq (s1,s2) ->
- let acc = vars_used_stmt acc s1 in
- vars_used_stmt acc s2
+ let env = vars_used_stmt env s1 in
+ vars_used_stmt env s2
| Sif (e,s1,s2) ->
- let used_env = vars_used_expr used_env e in
- let acc = vars_used_stmt (dec_env,used_env) s1 in
- vars_used_stmt acc s2
+ let env = vars_used_expr env e in
+ let env = vars_used_stmt env s1 in
+ vars_used_stmt env s2
| Sfor (s1,e,s2,s3) ->
- let used_env = vars_used_expr used_env e in
- let acc = vars_used_stmt (dec_env,used_env) s1 in
- let acc = vars_used_stmt acc s2 in
- vars_used_stmt acc s3
+ let env = vars_used_expr env e in
+ let env = vars_used_stmt env s1 in
+ let env = vars_used_stmt env s2 in
+ vars_used_stmt env s3
| Sswitch (e,s)
| Swhile (e,s)
| Sdowhile (s,e) ->
- let used_env = vars_used_expr used_env e in
- vars_used_stmt (dec_env,used_env) s
- | Sblock sl -> List.fold_left vars_used_stmt acc sl
+ let env = vars_used_expr env e in
+ vars_used_stmt env s
+ | Sblock sl -> List.fold_left vars_used_stmt env sl
| Sdecl (sto,id,ty,init) ->
- let dec_env = IdentMap.add id s.sloc dec_env
- and used_env = match init with
- | Some init ->vars_used_init used_env init
- | None -> used_env in
- dec_env,used_env
- | Slabeled (lbl,s) -> vars_used_stmt acc s
+ let env = match init with
+ | Some init ->vars_used_init env init
+ | None -> env in
+ env
+ | Slabeled (lbl,s) -> vars_used_stmt env s
| Sasm (attr,str,op,op2,constr) ->
let vars_asm_op env (_,_,e) =
vars_used_expr env e in
- let used_env = List.fold_left vars_asm_op used_env op in
- let used_env = List.fold_left vars_asm_op used_env op2 in
- dec_env,used_env
+ let env = List.fold_left vars_asm_op env op in
+ let env = List.fold_left vars_asm_op env op2 in
+ env
+
+let rec unused_variables_stmt env s =
+ match s.sdesc with
+ | Sbreak
+ | Scontinue
+ | Sgoto _
+ | Sreturn _
+ | Sskip
+ | Sasm _
+ | Sdo _ -> ()
+ | Sseq (s1,s2)
+ | Sif (_,s1,s2) ->
+ unused_variables_stmt env s1;
+ unused_variables_stmt env s2
+ | Sfor (s1,e,s2,s3) ->
+ unused_variables_stmt env s1;
+ unused_variables_stmt env s2;
+ unused_variables_stmt env s3
+ | Slabeled (_,s)
+ | Sswitch (_,s)
+ | Swhile (_,s)
+ | Sdowhile (s,_) ->
+ unused_variables_stmt env s
+ | Sblock sl -> List.iter (unused_variables_stmt env) sl
+ | Sdecl (sto,id,ty,init) -> if not (IdentSet.mem id env) then
+ warning s.sloc Unused_variable "unused variable '%s'" id.name
let unused_variables p =
List.iter (fun g -> match g.gdesc with
| Gfundef fd ->
- let dec_env,used_env = vars_used_stmt (IdentMap.empty,IdentSet.empty) fd.fd_body in
- IdentMap.iter (fun id loc -> if not (IdentSet.mem id used_env) then
- warning loc Unused_variable "unused variable '%s'" id.name) dec_env;
- List.iter (fun (id,_) -> if not (IdentSet.mem id used_env) then
+ let env = vars_used_stmt IdentSet.empty fd.fd_body in
+ unused_variables_stmt env fd.fd_body;
+ List.iter (fun (id,_) -> if not (IdentSet.mem id env) then
warning g.gloc Unused_parameter "unused parameter '%s'" id.name) fd.fd_params
| _ -> ()) p
diff --git a/cparser/Elab.ml b/cparser/Elab.ml
index d75e2410..050bdf6c 100644
--- a/cparser/Elab.ml
+++ b/cparser/Elab.ml
@@ -2675,4 +2675,5 @@ let elab_file prog =
ignore (elab_definitions false (Builtins.environment()) prog);
let p = elaborated_program () in
Checks.unused_variables p;
+ Checks.unknown_attrs_program p;
p
diff --git a/cparser/Parse.ml b/cparser/Parse.ml
index f7676083..ecd13332 100644
--- a/cparser/Parse.ml
+++ b/cparser/Parse.ml
@@ -24,9 +24,7 @@ let transform_program t p name =
(run_pass Unblock.program 'b'
(run_pass Bitfields.program 'f'
p)))) in
- let p2 = Rename.program p1 in
- Checks.unknown_attrs_program p2;
- p2
+ Rename.program p1
let parse_transformations s =
let t = ref CharSet.empty in