summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlasdair Armstrong2018-08-06 19:40:37 +0100
committerAlasdair Armstrong2018-08-06 19:40:37 +0100
commitd334535562953959c965ccace6392b0d87d1fb89 (patch)
tree61d264c50844b75ab65af860dfcd4f21e063b245 /src
parent747bd91bc4c9a6a30bd42a34d9e1c1676905a8e5 (diff)
Make sure monomorphic constructors are preserved
Diffstat (limited to 'src')
-rw-r--r--src/c_backend.ml8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/c_backend.ml b/src/c_backend.ml
index a54e6eb9..e1fde4dc 100644
--- a/src/c_backend.ml
+++ b/src/c_backend.ml
@@ -1828,10 +1828,14 @@ let rec specialize_variants ctx =
polymorphic_ctors
in
- let ctx = { ctx with variants = Bindings.add var_id !unifications ctx.variants } in
+ let monomorphic_ctors = List.filter (fun (_, ctyp) -> not (is_polymorphic ctyp)) ctors in
+
+ let ctx = { ctx with variants = Bindings.add var_id
+ (List.fold_left (fun m (id, ctyp) -> Bindings.add id ctyp m) !unifications monomorphic_ctors)
+ ctx.variants } in
let cdefs, ctx = specialize_variants ctx cdefs in
- CDEF_type (CTD_variant (var_id, (Bindings.bindings !unifications))) :: cdefs, ctx
+ CDEF_type (CTD_variant (var_id, monomorphic_ctors @ Bindings.bindings !unifications)) :: cdefs, ctx
| cdef :: cdefs ->
let remove_poly (I_aux (instr, aux)) =