summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wassell2020-07-15 08:43:42 +0100
committerMark Wassell2020-07-15 08:43:42 +0100
commitdfbdec56adca4ca82bea4ee477902522fbf30fa6 (patch)
tree8c69ae413eecc18847843d9c7c900f4ade4da7ca
parent7d815832a9410a3975c6ec8438556916eab493eb (diff)
Prevent creation of variant with existing type id and constructors that exist as constructor or function
-rw-r--r--src/type_check.ml41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/type_check.ml b/src/type_check.ml
index 4f0d90bc..d341fadc 100644
--- a/src/type_check.ml
+++ b/src/type_check.ml
@@ -590,6 +590,10 @@ end = struct
|| Bindings.mem id env.enums
|| Bindings.mem id builtin_typs
+ let bound_ctor_fn env id =
+ Bindings.mem id env.top_val_specs
+ || Bindings.mem id env.union_ids
+
let get_overloads id env =
try Bindings.find id env.overloads with
| Not_found -> []
@@ -941,9 +945,14 @@ end = struct
| Not_found -> typ_error env (id_loc id) ("No val spec found for " ^ string_of_id id)
let add_union_id id bind env =
- typ_print (lazy (adding ^ "union identifier " ^ string_of_id id ^ " : " ^ string_of_bind bind));
- { env with union_ids = Bindings.add id bind env.union_ids }
-
+ if bound_ctor_fn env id
+ then typ_error env (id_loc id) ("A union constructor or function already exists with name " ^ string_of_id id )
+ else
+ begin
+ typ_print (lazy (adding ^ "union identifier " ^ string_of_id id ^ " : " ^ string_of_bind bind));
+ { env with union_ids = Bindings.add id bind env.union_ids }
+ end
+
let get_union_id id env =
try
let bind = Bindings.find id env.union_ids in
@@ -1151,15 +1160,25 @@ end = struct
let get_toplevel_lets env = env.top_letbinds
let add_variant id variant env =
- typ_print (lazy (adding ^ "variant " ^ string_of_id id));
- { env with variants = Bindings.add id variant env.variants }
-
+ if bound_typ_id env id
+ then typ_error env (id_loc id) ("Cannot create variant " ^ string_of_id id ^ ", type name is already bound")
+ else
+ begin
+ typ_print (lazy (adding ^ "variant " ^ string_of_id id));
+ { env with variants = Bindings.add id variant env.variants }
+ end
+
let add_scattered_variant id typq env =
- typ_print (lazy (adding ^ "scattered variant " ^ string_of_id id));
- { env with
- variants = Bindings.add id (typq, []) env.variants;
- scattered_variant_envs = Bindings.add id env env.scattered_variant_envs
- }
+ if bound_typ_id env id
+ then typ_error env (id_loc id) ("Cannot create scattered variant " ^ string_of_id id ^ ", type name is already bound")
+ else
+ begin
+ typ_print (lazy (adding ^ "scattered variant " ^ string_of_id id));
+ { env with
+ variants = Bindings.add id (typq, []) env.variants;
+ scattered_variant_envs = Bindings.add id env env.scattered_variant_envs
+ }
+ end
let add_variant_clause id tu env =
match Bindings.find_opt id env.variants with