123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866(**************************************************************************)(* *)(* OCaml *)(* *)(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)(* *)(* Copyright 1996 Institut National de Recherche en Informatique et *)(* en Automatique. *)(* *)(* All rights reserved. This file is distributed under the terms of *)(* the GNU Lesser General Public License version 2.1, with the *)(* special exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)moduleMisc=structincludeMiscmoduleStdlib=Misc_stdlibend(* Predefined type constructors (with special typing rules in typecore) *)openPathopenTypesopenBtypemoduleJkind=Btype.Jkind0letbuiltin_idents=ref[]letwrapcreates=letid=createsinbuiltin_idents:=(s,id)::!builtin_idents;id(* Note: [ident_create] creates identifiers with [Ident.Predef], and later
portions of the compiler assume that expressions with these identifiers must
have types with layout value (see, e.g., the compilation of [Pgetpredef]
in `lambda.ml`). *)letident_create=wrapIdent.create_predefletident_int=ident_create"int"andident_char=ident_create"char"andident_bytes=ident_create"bytes"andident_float=ident_create"float"andident_float32=ident_create"float32"andident_bool=ident_create"bool"andident_unit=ident_create"unit"andident_exn=ident_create"exn"andident_array=ident_create"array"andident_iarray=ident_create"iarray"andident_list=ident_create"list"andident_option=ident_create"option"andident_nativeint=ident_create"nativeint"andident_int8=ident_create"int8"andident_int16=ident_create"int16"andident_int32=ident_create"int32"andident_int64=ident_create"int64"andident_lazy_t=ident_create"lazy_t"andident_string=ident_create"string"andident_extension_constructor=ident_create"extension_constructor"andident_floatarray=ident_create"floatarray"andident_lexing_position=ident_create"lexing_position"andident_atomic_loc=ident_create"atomic_loc"(* CR metaprogramming aivaskovic: there is a question about naming;
keep `expr` for now instead of `code` *)andident_code=ident_create"expr"andident_or_null=ident_create"or_null"andident_idx_imm=ident_create"idx_imm"andident_idx_mut=ident_create"idx_mut"andident_int8x16=ident_create"int8x16"andident_int16x8=ident_create"int16x8"andident_int32x4=ident_create"int32x4"andident_int64x2=ident_create"int64x2"andident_float16x8=ident_create"float16x8"andident_float32x4=ident_create"float32x4"andident_float64x2=ident_create"float64x2"andident_int8x32=ident_create"int8x32"andident_int16x16=ident_create"int16x16"andident_int32x8=ident_create"int32x8"andident_int64x4=ident_create"int64x4"andident_float16x16=ident_create"float16x16"andident_float32x8=ident_create"float32x8"andident_float64x4=ident_create"float64x4"andident_int8x64=ident_create"int8x64"andident_int16x32=ident_create"int16x32"andident_int32x16=ident_create"int32x16"andident_int64x8=ident_create"int64x8"andident_float16x32=ident_create"float16x32"andident_float32x16=ident_create"float32x16"andident_float64x8=ident_create"float64x8"letpath_int=Pidentident_intandpath_char=Pidentident_charandpath_bytes=Pidentident_bytesandpath_float=Pidentident_floatandpath_float32=Pidentident_float32andpath_bool=Pidentident_boolandpath_unit=Pidentident_unitandpath_exn=Pidentident_exnandpath_array=Pidentident_arrayandpath_iarray=Pidentident_iarrayandpath_list=Pidentident_listandpath_option=Pidentident_optionandpath_nativeint=Pidentident_nativeintandpath_int8=Pidentident_int8andpath_int16=Pidentident_int16andpath_int32 =Pidentident_int32andpath_int64=Pidentident_int64andpath_lazy_t=Pidentident_lazy_tandpath_string=Pidentident_stringandpath_extension_constructor=Pidentident_extension_constructorandpath_floatarray=Pidentident_floatarrayandpath_lexing_position=Pidentident_lexing_positionandpath_idx_imm=Pidentident_idx_immandpath_idx_mut=Pidentident_idx_mutandpath_atomic_loc=Pidentident_atomic_locandpath_code=Pidentident_codeandpath_or_null=Pidentident_or_nullandpath_int8x16=Pidentident_int8x16andpath_int16x8=Pidentident_int16x8andpath_int32x4=Pidentident_int32x4andpath_int64x2=Pidentident_int64x2andpath_float16x8=Pidentident_float16x8andpath_float32x4=Pidentident_float32x4andpath_float64x2=Pidentident_float64x2andpath_int8x32=Pidentident_int8x32andpath_int16x16=Pidentident_int16x16andpath_int32x8=Pidentident_int32x8andpath_int64x4=Pidentident_int64x4andpath_float16x16=Pidentident_float16x16andpath_float32x8=Pidentident_float32x8andpath_float64x4=Pidentident_float64x4andpath_int8x64=Pidentident_int8x64andpath_int16x32=Pidentident_int16x32andpath_int32x16=Pidentident_int32x16andpath_int64x8=Pidentident_int64x8andpath_float16x32=Pidentident_float16x32andpath_float32x16=Pidentident_float32x16andpath_float64x8=Pidentident_float64x8letpath_unboxed_float=Path.unboxed_versionpath_floatandpath_unboxed_unit=Path.unboxed_versionpath_unitandpath_unboxed_bool=Path.unboxed_versionpath_boolandpath_unboxed_float32=Path.unboxed_versionpath_float32andpath_unboxed_nativeint=Path.unboxed_versionpath_nativeintandpath_unboxed_char=Path.unboxed_versionpath_charandpath_unboxed_int=Path.unboxed_versionpath_intandpath_unboxed_int8=Path.unboxed_versionpath_int8andpath_unboxed_int16=Path.unboxed_versionpath_int16andpath_unboxed_int32=Path.unboxed_versionpath_int32andpath_unboxed_int64=Path.unboxed_versionpath_int64andpath_unboxed_int8x16=Path.unboxed_versionpath_int8x16andpath_unboxed_int16x8=Path.unboxed_versionpath_int16x8andpath_unboxed_int32x4=Path.unboxed_versionpath_int32x4andpath_unboxed_int64x2=Path.unboxed_versionpath_int64x2andpath_unboxed_float16x8=Path.unboxed_versionpath_float16x8andpath_unboxed_float32x4=Path.unboxed_versionpath_float32x4andpath_unboxed_float64x2=Path.unboxed_versionpath_float64x2andpath_unboxed_int8x32=Path.unboxed_versionpath_int8x32andpath_unboxed_int16x16=Path.unboxed_versionpath_int16x16andpath_unboxed_int32x8=Path.unboxed_versionpath_int32x8andpath_unboxed_int64x4=Path.unboxed_versionpath_int64x4andpath_unboxed_float16x16=Path.unboxed_versionpath_float16x16andpath_unboxed_float32x8=Path.unboxed_versionpath_float32x8andpath_unboxed_float64x4=Path.unboxed_versionpath_float64x4andpath_unboxed_int8x64=Path.unboxed_versionpath_int8x64andpath_unboxed_int16x32=Path.unboxed_versionpath_int16x32andpath_unboxed_int32x16=Path.unboxed_versionpath_int32x16andpath_unboxed_int64x8=Path.unboxed_versionpath_int64x8andpath_unboxed_float16x32=Path.unboxed_versionpath_float16x32andpath_unboxed_float32x16=Path.unboxed_versionpath_float32x16andpath_unboxed_float64x8=Path.unboxed_versionpath_float64x8lettype_int=newgenty(Tconstr(path_int,[],refMnil))andtype_int8=newgenty(Tconstr(path_int8,[],refMnil))andtype_int16=newgenty(Tconstr(path_int16,[],refMnil))andtype_char=newgenty(Tconstr(path_char,[],refMnil))andtype_bytes=newgenty(Tconstr(path_bytes,[],refMnil))andtype_float=newgenty(Tconstr(path_float,[],refMnil))andtype_float32=newgenty(Tconstr(path_float32,[],refMnil))andtype_bool=newgenty(Tconstr(path_bool,[],refMnil))andtype_unit=newgenty(Tconstr(path_unit,[],refMnil))andtype_exn=newgenty(Tconstr(path_exn,[],refMnil))andtype_arrayt=newgenty(Tconstr(path_array,[t],refMnil))andtype_iarrayt=newgenty(Tconstr(path_iarray,[t],refMnil))andtype_listt=newgenty(Tconstr(path_list,[t],refMnil))andtype_optiont=newgenty(Tconstr(path_option,[t],refMnil))andtype_nativeint=newgenty(Tconstr(path_nativeint,[],refMnil))andtype_int32=newgenty(Tconstr(path_int32,[],refMnil))andtype_int64=newgenty(Tconstr(path_int64,[],refMnil))andtype_lazy_tt=newgenty(Tconstr(path_lazy_t,[t],refMnil))andtype_string=newgenty(Tconstr(path_string,[],refMnil))andtype_extension_constructor=newgenty(Tconstr(path_extension_constructor,[],refMnil))andtype_floatarray=newgenty(Tconstr(path_floatarray,[],refMnil))andtype_lexing_position=newgenty(Tconstr(path_lexing_position,[],refMnil))andtype_atomic_loct=newgenty(Tconstr(path_atomic_loc,[t],refMnil))andtype_codet=newgenty(Tconstr(path_code,[t],refMnil))andtype_unboxed_unit=newgenty(Tconstr(path_unboxed_unit,[],refMnil))andtype_unboxed_bool=newgenty(Tconstr(path_unboxed_bool,[],refMnil))andtype_unboxed_float=newgenty(Tconstr(path_unboxed_float,[],refMnil))andtype_unboxed_float32=newgenty(Tconstr(path_unboxed_float32,[],refMnil))andtype_unboxed_nativeint=newgenty(Tconstr(path_unboxed_nativeint,[],refMnil))andtype_unboxed_int32=newgenty(Tconstr(path_unboxed_int32,[],refMnil))andtype_unboxed_int64=newgenty(Tconstr(path_unboxed_int64,[],refMnil))andtype_unboxed_char=newgenty(Tconstr(path_unboxed_char,[],refMnil))andtype_unboxed_int=newgenty(Tconstr(path_unboxed_int,[],refMnil))andtype_unboxed_int8=newgenty(Tconstr(path_unboxed_int8,[],refMnil))andtype_unboxed_int16=newgenty(Tconstr(path_unboxed_int16,[],refMnil))andtype_or_nullt=newgenty(Tconstr(path_or_null,[t],refMnil))andtype_idx_immt1t2=newgenty(Tconstr(path_idx_imm,[t1;t2],refMnil))andtype_idx_mutt1t2=newgenty(Tconstr(path_idx_mut,[t1;t2],refMnil))andtype_int8x16=newgenty(Tconstr(path_int8x16,[],refMnil))andtype_int16x8=newgenty(Tconstr(path_int16x8,[],refMnil))andtype_int32x4=newgenty(Tconstr(path_int32x4,[],refMnil))andtype_int64x2=newgenty(Tconstr(path_int64x2,[],refMnil))andtype_float16x8=newgenty(Tconstr(path_float16x8,[],refMnil))andtype_float32x4=newgenty(Tconstr(path_float32x4,[],refMnil))andtype_float64x2=newgenty(Tconstr(path_float64x2,[],refMnil))andtype_int8x32=newgenty(Tconstr(path_int8x32,[],refMnil))andtype_int16x16=newgenty(Tconstr(path_int16x16,[],refMnil))andtype_int32x8=newgenty(Tconstr(path_int32x8,[],refMnil))andtype_int64x4=newgenty(Tconstr(path_int64x4,[],refMnil))andtype_float16x16=newgenty(Tconstr(path_float16x16,[],refMnil))andtype_float32x8=newgenty(Tconstr(path_float32x8,[],refMnil))andtype_float64x4=newgenty(Tconstr(path_float64x4,[],refMnil))andtype_int8x64=newgenty(Tconstr(path_int8x64,[],refMnil))andtype_int16x32=newgenty(Tconstr(path_int16x32,[],refMnil))andtype_int32x16=newgenty(Tconstr(path_int32x16,[],refMnil))andtype_int64x8=newgenty(Tconstr(path_int64x8,[],refMnil))andtype_float16x32=newgenty(Tconstr(path_float16x32,[],refMnil))andtype_float32x16=newgenty(Tconstr(path_float32x16,[],refMnil))andtype_float64x8=newgenty(Tconstr(path_float64x8,[],refMnil))andtype_unboxed_int8x16=newgenty(Tconstr(path_unboxed_int8x16,[],refMnil))andtype_unboxed_int16x8=newgenty(Tconstr(path_unboxed_int16x8,[],refMnil))andtype_unboxed_int32x4=newgenty(Tconstr(path_unboxed_int32x4,[],refMnil))andtype_unboxed_int64x2=newgenty(Tconstr(path_unboxed_int64x2,[],refMnil))andtype_unboxed_float16x8=newgenty(Tconstr(path_unboxed_float16x8,[],refMnil))andtype_unboxed_float32x4=newgenty(Tconstr(path_unboxed_float32x4,[],refMnil))andtype_unboxed_float64x2=newgenty(Tconstr(path_unboxed_float64x2,[],refMnil))andtype_unboxed_int8x32=newgenty(Tconstr(path_unboxed_int8x32,[],refMnil))andtype_unboxed_int16x16=newgenty(Tconstr(path_unboxed_int16x16,[],refMnil))andtype_unboxed_int32x8=newgenty(Tconstr(path_unboxed_int32x8,[],refMnil))andtype_unboxed_int64x4=newgenty(Tconstr(path_unboxed_int64x4,[],refMnil))andtype_unboxed_float16x16=newgenty(Tconstr(path_unboxed_float16x16,[],refMnil))andtype_unboxed_float32x8=newgenty(Tconstr(path_unboxed_float32x8,[],refMnil))andtype_unboxed_float64x4=newgenty(Tconstr(path_unboxed_float64x4,[],refMnil))andtype_unboxed_int8x64=newgenty(Tconstr(path_unboxed_int8x64,[],refMnil))andtype_unboxed_int16x32=newgenty(Tconstr(path_unboxed_int16x32,[],refMnil))andtype_unboxed_int32x16=newgenty(Tconstr(path_unboxed_int32x16,[],refMnil))andtype_unboxed_int64x8=newgenty(Tconstr(path_unboxed_int64x8,[],refMnil))andtype_unboxed_float16x32=newgenty(Tconstr(path_unboxed_float16x32,[],refMnil))andtype_unboxed_float32x16=newgenty(Tconstr(path_unboxed_float32x16,[],refMnil))andtype_unboxed_float64x8=newgenty(Tconstr(path_unboxed_float64x8,[],refMnil))letident_match_failure=ident_create"Match_failure"andident_out_of_memory=ident_create"Out_of_memory"andident_out_of_fibers=ident_create"Out_of_fibers"andident_invalid_argument=ident_create"Invalid_argument"andident_failure=ident_create"Failure"andident_not_found=ident_create"Not_found"andident_sys_error=ident_create"Sys_error"andident_end_of_file=ident_create"End_of_file"andident_division_by_zero=ident_create"Division_by_zero"andident_stack_overflow=ident_create"Stack_overflow"andident_sys_blocked_io=ident_create"Sys_blocked_io"andident_assert_failure=ident_create"Assert_failure"andident_undefined_recursive_module=ident_create"Undefined_recursive_module"letall_predef_exns=[ident_match_failure;ident_out_of_memory;ident_out_of_fibers;ident_invalid_argument;ident_failure;ident_not_found;ident_sys_error;ident_end_of_file;ident_division_by_zero;ident_stack_overflow;ident_sys_blocked_io;ident_assert_failure;ident_undefined_recursive_module;]letpath_match_failure=Pidentident_match_failureandpath_invalid_argument=Pidentident_invalid_argumentandpath_assert_failure=Pidentident_assert_failureandpath_undefined_recursive_module=Pidentident_undefined_recursive_moduleletcstridargs={cd_id=id;cd_args=Cstr_tupleargs;cd_res=None;cd_loc=Location.none;cd_attributes=[];cd_uid=Uid.of_predef_idid;}letident_false=ident_create"false"andident_true=ident_create"true"andident_void=ident_create"()"andident_nil=ident_create"[]"andident_cons=ident_create"::"andident_none=ident_create"None"andident_some=ident_create"Some"andident_null=ident_create"Null"andident_this=ident_create"This"letoption_argument_sort=Jkind_types.Sort.Const.valueletoption_argument_jkind=Jkind.Builtin.value_or_null~why:(Type_argument{parent_path=path_option;position=1;arity=1})letlist_jkindparam=Jkind.Builtin.immutable_data~why:Boxed_variant|>Jkind.add_with_bounds~modality:Mode.Modality.Const.id~type_expr:param|>Jkind.mark_bestletlist_sort=Jkind_types.Sort.Const.valueletlist_argument_sort=Jkind_types.Sort.Const.valueletlist_argument_jkind=Jkind.Builtin.value_or_null~why:(Type_argument{parent_path=path_list;position=1;arity=1})letpredef_jkinds=List.map(fun(builtin:Jkind.Const.Builtin.t)->ident_createbuiltin.name,builtin.jkind)Jkind.Const.Builtin.builtinsletall_predef_jkinds=List.mapfstpredef_jkindsletadd_predef_jkindsadd_jkindenv=List.fold_left(funenv(id,jkind)->add_jkindidjkindenv)envpredef_jkindsletmk_add_typeadd_type=letadd_type_with_jkind?manifesttype_ident?(kind=Type_abstractDefinition)~jkind?unboxed_jkindenv=lettype_uid=Uid.of_predef_idtype_identinlettype_unboxed_version=matchunboxed_jkindwith|None->None|Someunboxed_jkind->lettype_jkind=Jkind.of_builtin~why:(Unboxed_primitivetype_ident)unboxed_jkindin(* All unboxed versions of types explicitly added in the predef are
abstract, as they are special cased. Other unboxed versions are
automatically derived. *)lettype_kind=Type_abstractDefinitioninlettype_manifest=matchmanifestwith|None->None|Some_->Misc.fatal_error"Predef.mk_add_type: non-[None] unboxed manifest"inSome{type_params=[];type_arity=0;type_kind;type_jkind=Jkind.mark_besttype_jkind;type_loc=Location.none;type_private=Asttypes.Public;type_manifest;type_variance=[];type_separability=[];type_is_newtype=false;type_expansion_scope=lowest_level;type_attributes=[];type_unboxed_default=false;type_uid=Uid.unboxed_versiontype_uid;type_unboxed_version=None;}inletdecl={type_params=[];type_arity=0;type_kind=kind;type_jkind=Jkind.mark_bestjkind;type_loc=Location.none;type_private=Asttypes.Public;type_manifest=manifest;type_variance=[];type_separability=[];type_is_newtype=false;type_expansion_scope=lowest_level;type_attributes=[];type_unboxed_default=false;type_uid;type_unboxed_version;}inadd_typetype_identdeclenvinletadd_type?manifesttype_ident?kind~jkind?unboxed_jkindenv=letjkind=Jkind.of_builtin~why:(Primitivetype_ident)jkindinadd_type_with_jkind?manifesttype_ident?kind~jkind?unboxed_jkindenvinadd_type_with_jkind,add_typeletmk_add_type1add_typetype_ident?(kind=fun_->Type_abstractDefinition)~jkind?(param_jkind=Jkind.Builtin.value~why:(Type_argument{parent_path=Path.Pidenttype_ident;position=1;arity=1}))~variance~separabilityenv=letparam=newgenvarparam_jkindinletdecl={type_params=[param];type_arity=1;type_kind=kindparam;type_jkind=Jkind.mark_best(jkindparam);type_loc=Location.none;type_private=Asttypes.Public;type_manifest=None;type_variance=[variance];type_separability=[separability];type_is_newtype=false;type_expansion_scope=lowest_level;type_attributes=[];type_unboxed_default=false;type_uid=Uid.of_predef_idtype_ident;type_unboxed_version=None;}inadd_typetype_identdeclenvletmk_add_type2add_typetype_ident~jkind~param1_jkind~param2_jkind~type_variance~type_separabilityenv=letparam1=newgenvarparam1_jkindinletparam2=newgenvarparam2_jkindinletdecl={type_params=[param1;param2];type_arity=2;type_kind=Type_abstractDefinition;type_jkind=Jkind.mark_bestjkind;type_loc=Location.none;type_private=Asttypes.Public;type_manifest=None;type_variance;type_separability;type_is_newtype=false;type_expansion_scope=lowest_level;type_attributes=[];type_unboxed_default=false;type_uid=Uid.of_predef_idtype_ident;type_unboxed_version=None;}inadd_typetype_identdeclenvletmk_add_extensionadd_extensionidargs=List.iter(fun(_,sort)->letraise_error()=Misc.fatal_error"sanity check failed: non-value jkind in predef extension \
constructor; should this have Constructor_mixed shape?"inmatch(sort:Jkind_types.Sort.Const.t)with|BaseValue->()|Base(Void|Untagged_immediate|Float32|Float64|Word|Bits8|Bits16|Bits32|Bits64|Vec128|Vec256|Vec512)|Univar_|Product_->raise_error())args;add_extensionid{ext_type_path=path_exn;ext_type_params=[];ext_args=Cstr_tuple(List.map(fun(ca_type,ca_sort)->{ca_type;ca_sort;ca_modalities=Mode.Modality.Const.id;ca_loc=Location.none})args);ext_shape=Constructor_uniform_value;ext_constant=args=[];ext_ret_type=None;ext_private=Asttypes.Public;ext_loc=Location.none;ext_attributes=[Ast_helper.Attr.mk(Location.mknoloc"ocaml.warn_on_literal_pattern")(Parsetree.PStr[])];ext_uid=Uid.of_predef_idid;}letmk_add_jkindadd_jkind=letadd_jkindidjkindenv=letdecl={jkind_manifest=Somejkind;jkind_attributes=[];jkind_uid=Uid.of_predef_idid;jkind_loc=Location.none}inadd_jkindiddeclenvinadd_jkindletvariantconstrs=letmk_elt{cd_args}=letsorts=matchcd_argswith|Cstr_tupleargs->Misc.Stdlib.Array.of_list_map(fun{ca_sort}->ca_sort)args|Cstr_recordlbls->Misc.Stdlib.Array.of_list_map(fun{ld_sort}->ld_sort)lblsinConstructor_uniform_value,sortsinType_variant(constrs,Variant_boxed(Misc.Stdlib.Array.of_list_mapmk_eltconstrs),None)letunrestrictedtvarca_sort={ca_type=tvar;ca_sort;ca_modalities=Mode.Modality.Const.id;ca_loc=Location.none}(* CR layouts: Changes will be needed here as we add support for the built-ins
to work with non-values, and as we relax the mixed block restriction. *)letbuild_initial_envadd_typeadd_extensionadd_jkindempty_env=letadd_type_with_jkind,add_type=mk_add_typeadd_typeandadd_type1=mk_add_type1add_typeandadd_type2=mk_add_type2add_typeandadd_extension=mk_add_extensionadd_extensionandadd_jkind=mk_add_jkindadd_jkindinempty_env(* Predefined types *)|>add_type1ident_array~variance:Variance.full~separability:Separability.Ind~param_jkind:Jkind.for_array_argument~jkind:(funparam->Jkind.Builtin.mutable_data~why:(Primitiveident_array)|>Jkind.add_with_bounds~modality:Mode.Modality.Const.id~type_expr:param)|>add_type1ident_iarray~variance:Variance.covariant~separability:Separability.Ind~param_jkind:Jkind.for_array_argument~jkind:(funparam->Jkind.Builtin.immutable_data~why:(Primitiveident_iarray)|>Jkind.add_with_bounds~modality:Mode.Modality.Const.id~type_expr:param)|>add_typeident_bool~kind:(variant[cstrident_false[];cstrident_true[]])~jkind:Jkind.Const.Builtin.immediate~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_bool|>add_typeident_char~jkind:Jkind.Const.Builtin.immediate~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_int8|>add_typeident_exn~kind:Type_open~jkind:Jkind.Const.Builtin.exn|>add_typeident_extension_constructor~jkind:Jkind.Const.Builtin.immutable_data|>add_type_with_jkindident_float~jkind:(Jkind.for_floatident_float)~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_float|>add_typeident_floatarray~jkind:Jkind.Const.Builtin.mutable_data|>add_typeident_int~jkind:Jkind.Const.Builtin.immediate~unboxed_jkind:Jkind.Const.Builtin.kind_of_untagged_int|>add_typeident_int32~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_int32|>add_typeident_int64~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_int64|>add_type1ident_lazy_t~variance:Variance.covariant~separability:Separability.Ind(* CR layouts v2.8: Can [lazy_t] mode-cross at all? According to Zesen:
It can at least cross locality, because it's always heap-allocated.
It might also cross portability, linearity, uniqueness subject to its
parameter. But I'm also fine not doing that for now (and wait until
users complains). Internal ticket 5103. *)~jkind:(fun_->Jkind.for_non_float~why:(Primitiveident_lazy_t))|>add_type1ident_list~variance:Variance.covariant~separability:Separability.Ind~kind:(funtvar->variant[cstrident_nil[];cstrident_cons[unrestrictedtvarlist_argument_sort;unrestricted(type_listtvar)list_sort]])~param_jkind:list_argument_jkind~jkind:list_jkind|>add_typeident_nativeint~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_nativeint|>add_type1ident_option~variance:Variance.covariant~separability:Separability.Ind~kind:(funtvar->variant[cstrident_none[];cstrident_some[unrestrictedtvaroption_argument_sort]])~param_jkind:option_argument_jkind~jkind:(funparam->Jkind.Builtin.immutable_data~why:Boxed_variant|>Jkind.add_with_bounds~modality:Mode.Modality.Const.id~type_expr:param)|>add_type2ident_idx_imm~param1_jkind:(Jkind.Builtin.value~why:(Type_argument{parent_path=Path.Pidentident_idx_imm;position=1;arity=2;}))~param2_jkind:(Jkind.Builtin.any~why:(Type_argument{parent_path=Path.Pidentident_idx_imm;position=2;arity=2;}))~jkind:(Jkind.of_builtin~why:(Primitiveident_idx_imm)Jkind.Const.Builtin.kind_of_idx)~type_variance:[Variance.full;Variance.covariant]~type_separability:[Separability.Ind;Separability.Ind]|>add_type2ident_idx_mut~param1_jkind:(Jkind.Builtin.value~why:(Type_argument{parent_path=Path.Pidentident_idx_mut;position=1;arity=2;}))~param2_jkind:(Jkind.Builtin.any~why:(Type_argument{parent_path=Path.Pidentident_idx_mut;position=2;arity=2;}))~jkind:(Jkind.of_builtin~why:(Primitiveident_idx_mut)Jkind.Const.Builtin.kind_of_idx)~type_variance:[Variance.full;Variance.full]~type_separability:[Separability.Ind;Separability.Ind]|>add_type_with_jkindident_lexing_position~kind:(letlbl(field,field_type)=letid=Ident.create_predeffieldin{ld_id=id;ld_mutable=Immutable;ld_modalities=Mode.Modality.Const.id;ld_type=field_type;ld_sort=Jkind_types.Sort.Const.value;ld_loc=Location.none;ld_attributes=[];ld_uid=Uid.of_predef_idid;}inletlabels=List.maplbl[("pos_fname",type_string);("pos_lnum",type_int);("pos_bol",type_int);("pos_cnum",type_int)]inType_record(labels,(Record_boxed(List.map(funlabel->label.ld_sort)labels|>Array.of_list)),None))(* CR layouts v2.8: Possibly remove this -- and simplify [mk_add_type] --
when we have a better jkind subsumption check. Internal ticket 5104 *)~jkind:Jkind.(of_builtinConst.Builtin.immutable_data~why:(Primitiveident_lexing_position)|>add_with_bounds~modality:Mode.Modality.Const.id~type_expr:type_int|>add_with_bounds~modality:Mode.Modality.Const.id~type_expr:type_int|>add_with_bounds~modality:Mode.Modality.Const.id~type_expr:type_int|>add_with_bounds~modality:Mode.Modality.Const.id~type_expr:type_string)|>add_type1ident_atomic_loc~variance:Variance.full~separability:Separability.Ind~param_jkind:(Jkind.Builtin.value_or_null~why:(Primitiveident_atomic_loc))~jkind:(funparam->Jkind.Builtin.sync_data~why:(Primitiveident_atomic_loc)|>Jkind.add_with_bounds~modality:Mode.Modality.Const.id~type_expr:param)|>add_typeident_string~jkind:Jkind.Const.Builtin.immutable_data|>add_type1ident_code~variance:Variance.covariant~separability:Separability.Ind~jkind:(funparam->Jkind.Builtin.immutable_data~why:Tquote|>Jkind.add_with_bounds~modality:Mode.Modality.Const.id~type_expr:param)|>add_typeident_bytes~jkind:Jkind.Const.Builtin.mutable_data|>add_typeident_unit~kind:(variant[cstrident_void[]])~jkind:Jkind.Const.Builtin.immediate~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_unit(* Predefined exceptions - alphabetical order *)|>add_extensionident_assert_failure[newgenty(Ttuple[None,type_string;None,type_int;None,type_int]),Jkind_types.Sort.Const.value]|>add_extensionident_division_by_zero[]|>add_extensionident_end_of_file[]|>add_extensionident_failure[type_string,Jkind_types.Sort.Const.value]|>add_extensionident_invalid_argument[type_string,Jkind_types.Sort.Const.value]|>add_extensionident_match_failure[newgenty(Ttuple[None,type_string;None,type_int;None,type_int]),Jkind_types.Sort.Const.value]|>add_extensionident_not_found[]|>add_extensionident_out_of_memory[]|>add_extensionident_out_of_fibers[]|>add_extensionident_stack_overflow[]|>add_extensionident_sys_blocked_io[]|>add_extensionident_sys_error[type_string,Jkind_types.Sort.Const.value]|>add_extensionident_undefined_recursive_module[newgenty(Ttuple[None,type_string;None,type_int;None,type_int]),Jkind_types.Sort.Const.value](* Predefined jkinds *)|>add_predef_jkindsadd_jkindletadd_simd_stable_extension_typesadd_typeenv=let_,add_type=mk_add_typeadd_typeinenv|>add_typeident_int8x16~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_128bit_vectors|>add_typeident_int16x8~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_128bit_vectors|>add_typeident_int32x4~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_128bit_vectors|>add_typeident_int64x2~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_128bit_vectors|>add_typeident_float16x8~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_128bit_vectors|>add_typeident_float32x4~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_128bit_vectors|>add_typeident_float64x2~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_128bit_vectors|>add_typeident_int8x32~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_256bit_vectors|>add_typeident_int16x16~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_256bit_vectors|>add_typeident_int32x8~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_256bit_vectors|>add_typeident_int64x4~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_256bit_vectors|>add_typeident_float16x16~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_256bit_vectors|>add_typeident_float32x8~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_256bit_vectors|>add_typeident_float64x4~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_256bit_vectorsletadd_simd_beta_extension_types_add_typeenv=envletadd_simd_alpha_extension_typesadd_typeenv=let_,add_type=mk_add_typeadd_typeinenv|>add_typeident_int8x64~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_512bit_vectors|>add_typeident_int16x32~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_512bit_vectors|>add_typeident_int32x16~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_512bit_vectors|>add_typeident_int64x8~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_512bit_vectors|>add_typeident_float16x32~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_512bit_vectors|>add_typeident_float32x16~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_512bit_vectors|>add_typeident_float64x8~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_512bit_vectorsletadd_small_number_extension_typesadd_typeenv=let_,add_type=mk_add_typeadd_typeinenv|>add_typeident_float32~jkind:Jkind.Const.Builtin.immutable_data~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_float32|>add_typeident_int8~jkind:Jkind.Const.Builtin.immediate~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_int8|>add_typeident_int16~jkind:Jkind.Const.Builtin.immediate~unboxed_jkind:Jkind.Const.Builtin.kind_of_unboxed_int16letadd_small_number_beta_extension_types_add_typeenv=envletor_null_argument_sort=Jkind_types.Sort.Const.valueletor_null_kindtvar=letcstrs=[cstrident_null[];cstrident_this[unrestrictedtvaror_null_argument_sort]]inType_variant(cstrs,Variant_with_null,None)letor_null_jkindparam=Jkind.Const.Builtin.value_or_null_mod_everything|>Jkind.of_builtin~why:(Primitiveident_or_null)|>Jkind.add_with_bounds~modality:Mode.Modality.Const.id~type_expr:param|>Jkind.mark_bestletadd_or_nulladd_typeenv=letadd_type1=mk_add_type1add_typeinenv|>add_type1ident_or_null~variance:Variance.covariant~separability:Separability.Ind(* CR layouts v3: [or_null] is separable only if the argument type
is non-float. The current separability system can't track that.
We also want to allow [float or_null] despite it being non-separable.
For now, we mark the type argument as [Separability.Ind] to permit
the most argument types, and forbid arrays from accepting [or_null]s.
In the future, we will track separability in the jkind system. *)~kind:or_null_kind~param_jkind:(Jkind.for_or_null_argumentident_or_null)~jkind:or_null_jkindletbuiltin_values=List.map(funid->(Ident.nameid,id))all_predef_exnsletbuiltin_idents=List.rev!builtin_idents