aboutsummaryrefslogtreecommitdiffhomepage
path: root/plugins/extraction/ocaml.ml
diff options
context:
space:
mode:
authorGravatar letouzey <letouzey@85f007b7-540e-0410-9357-904b9bb8a0f7>2011-03-07 15:37:51 +0000
committerGravatar letouzey <letouzey@85f007b7-540e-0410-9357-904b9bb8a0f7>2011-03-07 15:37:51 +0000
commit2d0293367d13ac8ef8c337ba1dd0085f83dc501b (patch)
tree536ce1b2bb5adb54cc49350a2f7555d61ae289f3 /plugins/extraction/ocaml.ml
parent695bf462bba223c8870634bac7cb149ffb0b28b6 (diff)
Extraction: avoid printing unused mutual fix components (fix #2477)
This happens for instance when the main component of the fixpoint block has been provided via Extract Constant git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@13889 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'plugins/extraction/ocaml.ml')
-rw-r--r--plugins/extraction/ocaml.ml25
1 files changed, 16 insertions, 9 deletions
diff --git a/plugins/extraction/ocaml.ml b/plugins/extraction/ocaml.ml
index 543cec6e5..d3a6fceed 100644
--- a/plugins/extraction/ocaml.ml
+++ b/plugins/extraction/ocaml.ml
@@ -413,17 +413,24 @@ let pp_Dfix (rv,c,t) =
let names = Array.map
(fun r -> if is_inline_custom r then mt () else pp_global Term r) rv
in
- let rec pp sep letand i =
- if i >= Array.length rv then mt ()
- else if is_inline_custom rv.(i) then pp sep letand (i+1)
+ let rec pp init i =
+ if i >= Array.length rv then
+ (if init then failwith "empty phrase" else mt ())
else
- let def =
- if is_custom rv.(i) then str " = " ++ str (find_custom rv.(i))
- else pp_function (empty_env ()) c.(i)
+ let void = is_inline_custom rv.(i) ||
+ (not (is_custom rv.(i)) && c.(i) = MLexn "UNUSED")
in
- sep () ++ pp_val names.(i) t.(i) ++
- str letand ++ names.(i) ++ def ++ pp fnl2 "and " (i+1)
- in pp mt "let rec " 0
+ if void then pp init (i+1)
+ else
+ let def =
+ if is_custom rv.(i) then str " = " ++ str (find_custom rv.(i))
+ else pp_function (empty_env ()) c.(i)
+ in
+ (if init then mt () else fnl2 ()) ++
+ pp_val names.(i) t.(i) ++
+ str (if init then "let rec " else "and ") ++ names.(i) ++ def ++
+ pp false (i+1)
+ in pp true 0
(*s Pretty-printing of inductive types declaration. *)