diff options
| author | Alasdair Armstrong | 2018-08-06 19:40:37 +0100 |
|---|---|---|
| committer | Alasdair Armstrong | 2018-08-06 19:40:37 +0100 |
| commit | d334535562953959c965ccace6392b0d87d1fb89 (patch) | |
| tree | 61d264c50844b75ab65af860dfcd4f21e063b245 /src | |
| parent | 747bd91bc4c9a6a30bd42a34d9e1c1676905a8e5 (diff) | |
Make sure monomorphic constructors are preserved
Diffstat (limited to 'src')
| -rw-r--r-- | src/c_backend.ml | 8 |
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)) = |
